提问:这个程序为啥运行不对呢?(括号匹配的判断)
网友回答:
你程序有多个错(你对指针的理解有问题)
1。
struct stack *s; initstack(&s);
这样你的s是二级指针了,且它没有初始化
你的void initstack(stack *s)就完全不对了
正确的要用
void initstack(stack **s)
且*s要初始化的
*s=(stack *)malloc(sizeof(stack));
后面的也全要改的
(*s)->top =(char*)malloc((100)*sizeof(char));
(*s)->base =(*s)->top ;
(*s)->stacksize =100;
2。
你既然定义了typedef struct,那说不要用struct stack *s;而是用stack *s;了
3。
你的match(&s);也错了,s已经是指针了,只要match(s);就可以了
4。你的
void pop(stack *s,char e)
它不会改e的错的(这个是基础),你要用指针的,改为
void pop(stack *s,char e)
然后调用时改
pop(s,e);
为
pop(s,&e);
5。程序中两处elseif应该是else if (可能是复制的问题)
完整改好的可运行的
#include<stdio.h> #include<malloc.h> #include<string.h> typedef struct { int stacksize; char *top; char *base; } stack; void initstack(stack **s) { *s=(stack *)malloc(sizeof(stack)); (*s)->top =(char*)malloc((100)*sizeof(char)); (*s)->base =(*s)->top ; (*s)->stacksize =100; } void push(stack *s,char e) { *s->top =e; s->top++; } void pop(stack *s,char *e) { s->top--; *e=*s->top; } int panduan(char a,char b) { if(a=='('&&b==')') return 0; else if(a=='{'&&b=='}') return 0; else if(a=='['&&b==']') return 0; else return 1; } int match(stack *s) { char c,e; c=getchar(); while(c!='#') { if(c=='('||c=='{'||c=='[') push(s,c); if(c==')'||c=='}'||c==']') { if(s->top ==s->base ) { printf("不匹配"); return 0; } else pop(s,&e); if(panduan(e,c)) { printf("不匹配"); return 0; } } c=getchar(); } if(s->top ==s->base ) printf("匹配"); else printf("不匹配"); return 1; } int main() { stack *s; initstack(&s); match(s); }