我将堆栈实现为链接列表,我想创建一个函数,以告诉方括号是否正确,例如:(())是好())(是不好的。知道为什么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
成员实际上在两侧都是相同的,因此假设top
和temp->sljedeci
都不为null,则它什么也不做。如果任何一个为NULL,则将调用undefined behavior,因为您取消引用了空指针。所以摆脱这条线。您在
pop
中也有内存泄漏:temp = (stog*)malloc(sizeof(stog));
temp = top;
您分配内存并将其地址分配给
temp
,但是随后您立即用top
的值覆盖了该地址。无需在此处分配更多的内存,因此删除
malloc
调用。