提问:这个程序为啥运行不对呢?(括号匹配的判断)
网友回答:
你程序有多个错(你对指针的理解有问题)
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
#include
#include
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);
}