使用堆栈的平衡括号

时间:2014-11-04 16:37:52

标签: c stack

我正在尝试使用CI中的Stacks的平衡括号算法正确地找出了当parantheses相同时的方式(例如“()”或“{}”或“[]”)但是当它们混合时然后我我得到了错误的答案

我的代码中出现了什么错误?

  

int count=0; typedef struct node{ struct node *next; char data; }node; node *top; node *local; node *temp; void create(){ top=NULL; } void push(char data){ if(top==NULL){ top=malloc(sizeof(node)); top->next=NULL; top->data=data; } else{ temp=malloc(sizeof(node)); temp->data=data; temp->next=top; top=temp; } count++; } char pop(){ local=top; if(local==NULL){ printf("Empty stack\n"); return; } else{ local=local->next; } //printf("%d\n",top->data ); return top->data; free(top); top=local; count--; } int empty() { return top==NULL; } int match(char a,char b) { if(a=='[' && b==']') return 1; if(a=='{' && b=='}') return 1; if(a=='(' && b==')') return 1; return 0; }/*End of match()*/ int main() { int no, ch, e; char str[51]; scanf("%s",str); int z; int i; char temp; int balanced=1; z=strlen(str); for(i=0;i<z;i++) { if(str[i]=='(' || str[i]=='{' || str[i]=='[') push(str[i]); else if(str[i]==')' || str[i]=='}' || str[i]==']') {temp=pop(); if(empty) balanced=0; if(!match(str[i],temp)) balanced=0; else balanced=1; } } printf("%d\n",balanced ); return 0; }

`

1 个答案:

答案 0 :(得分:2)

忽略pop()函数和其余堆栈代码中的问题,我会做平衡算法,如:

int balanced = 0;

for(i = 0; i < strlen(str); ++i)
{
    if(str[i]=='(' || str[i]=='{' || str[i]=='[')
    {
        push(str[i]);
        ++balanced;
    }
    else if(str[i]==')' || str[i]=='}' || str[i]==']')
    {
        temp = pop();
        if (match(str[i], temp)) --balanced;
    }
}

printf("%d\n", balanced);

如果最后balanced为0,那么您就知道所有括号都是平衡的。如果它是正数,则表示您缺少或有一个不平衡的右括号。