我正在尝试实现一个堆栈来解决括号问题,但我对指针感到困惑(我是C的新手) 这是我目前的代码:
typedef struct node{
char data;
struct node *next;
}node;
typedef struct stack{
struct node **head;
}stack;
void push(stack *s, char c){
node *n = (node *)malloc(sizeof(node));
n->data = c;
if(*s->head == NULL){
n->next = *s->head;
*s->head = n;
}
else{
n->next = *s->head;
*s->head = n;
}
}
void pop(stack *s){
if(s->head->next == NULL){
*s->head = NULL;
}
else{
node *temp = *s->head;
*s->head = s->head->next;
free(temp);
}
}
bool isStringBalanced(char** sentence, int size){
stack *s = malloc(sizeof(stack));
*s->head = NULL;
for(int i = 0; i < size; i++){
int j = 0;
while(sentence[i][j] != '\0'){
switch(sentence[i][j]){
case '(' : push(s, '('); break;
case '[' : push(s, '['); break;
case '{' : push(s, '{'); break;
case ')' :
if(*s->head)
if(*s->head->data == '(')
pop(s);
else return false;
else return false;
break;
case ']' :
if(*s->head)
if(*s->head->data == '[')
pop(s);
else return false;
else return false;
break;
case '}' :
if(*s->head)
if(*s->head->data == '{')
pop(s);
else return false;
else return false;
break;
}
j++;
}
}
if(!s->head)
return true;
else
return false;
}
当我尝试运行此功能时,我会在所有双箭头上出现错误,例如s-&gt; head-&gt; data和s-&gt; head-&gt; next 帮助我了解如何使用正确的双指针 感谢。
答案 0 :(得分:3)
双指针是指向指针的指针。例如,当你这样做时很有用 希望函数在指针指向的位置发生变化:
World
Hello
这将打印 1 :
stack
双指针可用于存储数组或指针数组。这个 可用于例如存储矩阵。
在你的情况下,head
中的双指针不需要,它在一个内部
结构体。当然你可以将它声明为双指针,但它会生效
不必要的更难。 stack
已经在结构中,你通常会通过
head
整个对象。所以功能改变了指向位置
head
可以在不需要双指针的情况下执行此操作,因为typedef struct stack{
struct node *head;
}stack;
不是
变量,它是结构的成员(参见下面的示例)。
所以你可以把它重写为:
push
然后int push(stack *s, char c)
{
node *n = calloc(1, sizeof *n);
if(n == NULL)
return 0;
n->data = c;
n->next = s->head;
s->head = n; // see footnote 2
}
可以改写为:
->
关于.
和->
的问题:.
和.
用于访问
结构的成员。如果变量(或表达式)不是指针,则使用->
,如果是
变量(或表达式)是一个指针,然后使用// Note these examples show only how to use -> and .
stack *s;
s->next; // because s is a pointer
s->next->next; // because s->next is a pointer
s->next->next->data // because s->next->next is a pointer
stack s;
s.next; // because s is not a pointer
s.next->next; // because s is not a pointer, but s.next is a pointer
s.next->next->data; // because s is not a pointer, but s.next is a pointer
// and s.next->next is also a pointer
。它很简单
的是:
'\0'
<强> fotenotes 强>
1 字符串文字(引号中的字符串)返回where的地址
存储字符序列。在C中,字符串只是一个序列
以const char *x = "Hello";
结尾的字符 - 终止字节。
当你这样做时
x
你不将字符串复制到base = some memory location
base
+---+---+---+---+---+----+
| H | e | l | l | o | \0 |
+---+---+---+---+---+----+
,你要分配的位置是
序列
char
x
的到指针x
。 base
的值是地址if(n->head == NULL)
。
2 感谢用户user7231指出在这种情况下甚至是
null
检查不是必需的。我使用了更新了我的答案
他/她的台词。积分转到user7231。