使用C获取错误实现堆栈:是一个指针;你的意思是使用' - >'吗?

时间:2018-02-05 23:47:12

标签: c pointers

我正在尝试实现一个堆栈来解决括号问题,但我对指针感到困惑(我是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 帮助我了解如何使用正确的双指针 感谢。

1 个答案:

答案 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

到指针xbase的值是地址if(n->head == NULL)

2 感谢用户user7231指出在这种情况下甚至是 null检查不是必需的。我使用了更新了我的答案 他/她的台词。积分转到user7231