我将堆栈实现为链接列表,我想创建一个函数,以告诉方括号是否正确,例如:(())是好())(是不好的。知道为什么pop()只工作一次,这是我的代码(存储是堆栈,下一个是sljedeci):

struct stog {
    int x;
    stog *sljedeci;
};

typedef struct stog stog;

stog *top;
char pop() {
    stog *temp;
    temp = (stog*)malloc(sizeof(stog));
    temp = top;
    char n = temp->x;
    top = temp->sljedeci;
    top->x = temp->sljedeci->x;
    free(temp);
    return n;
}



void init() {
    top = NULL;
}

void push(char x) {
        stog *temp;
        temp=(stog*)malloc(sizeof(stog));
        temp->x = x;
        temp->sljedeci = top;
        top = temp;
    }

 void Brackets(const char* msg) {
    char z;
    for (int i = 0; i < strlen(msg); i++) {
        if (msg[i] == '(') {
            push('(');
        }
        if (msg[i]==')'){
            z = pop();
            printf("Bad\n");
        }
    }
}

int main() {

    const char* msg = "(())";
    init();
    Brackets(msg);
    return 0;
}


输出为:



它应该是:




编辑:添加了init()和push()函数

最佳答案

pop中的这一行没有意义:

top->x = temp->sljedeci->x;


在上一行中,将temp->sljedeci分配给top。因此,此处引用的x成员实际上在两侧都是相同的,因此假设toptemp->sljedeci都不为null,则它什么也不做。如果任何一个为NULL,则将调用undefined behavior,因为您取消引用了空指针。所以摆脱这条线。

您在pop中也有内存泄漏:

temp = (stog*)malloc(sizeof(stog));
temp = top;


您分配内存并将其地址分配给temp,但是随后您立即用top的值覆盖了该地址。

无需在此处分配更多的内存,因此删除malloc调用。

07-24 13:41