中易网

用栈检查括号是否匹配的问题(急!!!再线等)

答案:4  悬赏:70  
解决时间 2021-01-14 07:40
  • 提问者网友:几叶到寒
  • 2021-01-13 22:25
用栈检查括号是否匹配的问题(急!!!再线等)
最佳答案
  • 二级知识专家网友:旧脸谱
  • 2021-01-13 23:55
哥们我帮你看看.
别急..我才把程序排成标准格式

假设:{}()}
再)后top=NULL,但是}要求取top->c所以出错

下面是我按你的模式改的,有错误请提出来,

#include
#include

typedef struct bracket
{
char c;
struct bracket *next;
}BRACKET;
BRACKET *top=NULL;

BRACKET *pushstack(BRACKET *top,char c)
{
BRACKET *p=(BRACKET*)malloc(sizeof(struct bracket));
p->c=c;
if(top==NULL)
{
p->next=NULL;
top=p;
}
else
{
p->next=top;
top=p;
}
printf("%c入盏\n",top->c);
return top;
}
BRACKET *popstack(BRACKET *top)
{
BRACKET *p;
p=top;
if(top==NULL)
return top;
else
{
top=top->next;
free(p);
return top;
}
}
int dispose(char *str)
{
for(;*str;str++)
{
printf("%c\n",*str);
if(*str=='('||*str=='{'||*str=='[')
{
top=pushstack(top,*str);
}
else if(*str==')')
{
if(top==NULL)
{
return 0;
}
if(top->c=='(')
top=popstack(top);
else return 0;
}
else if(*str=='}')
{
if(top==NULL)
{
return 0;
}
if(top->c=='{')
top=popstack(top);
else
return 0;
}
else if(*str==']')
{
if(top==NULL)
{
return 0;
}
if(top->c=='[')
top=popstack(top);
else return 0;
}
}
if(top==NULL)
return 1;
else
return 0;
}
int main()
{
char string[30];
int flag;
gets(string);
flag=dispose(string);
printf("\n%d",flag);
getchar();

return 0;
}
全部回答
  • 1楼网友:洒脱疯子
  • 2021-01-14 02:06
#include
#include
typedef struct bracket
{
char c;
struct bracket *next;
}BRACKET;
BRACKET *top=NULL;
BRACKET *pushstack(BRACKET *&top,char c) //top前加&
{
BRACKET *p=(BRACKET*)malloc(sizeof(struct bracket));
p->c=c;
if(top==NULL)
{
p->next=NULL;
top=p;
}
else
{
p->next=top;
top=p;
}
//printf("%c\n",top->c);
return top;
}
BRACKET *popstack(BRACKET *&top) //加top前加上&符号
{
BRACKET *p;
p=top;
if(top==NULL)
return top;
else
{
top=top->next;
free(p);
return top;
}
}
int dispose(char *str)
{
for(;*str!='\0';str++) //这里*str!='\0'替换原来的主要是为了读程序方便
{
printf("%c\n",*str);
if(*str=='('||*str=='{'||*str=='[')
pushstack(top,*str);
else if(*str==')')
{
if(top->c=='(')
top=popstack(top);
else return 0;
}
else if(*str=='}')
{
if(top->c=='{')
top=popstack(top);
else return 0;
}
else if(*str==']')
{
if(top->c=='[')
top=popstack(top);
else return 0;
}
}
if(top==NULL)
return 1;
else
return 0;
}
int main()
{
char string[30];
int flag;
gets(string);
flag=dispose(string);
printf("\n%d",flag);
return 0;
}
  • 2楼网友:渡鹤影
  • 2021-01-14 01:38
我看了一下,你的压栈没有成功,所以会出错!!
你把压栈和出栈函数改成下面格式就行了,不要把top当成参数传进去
*popstack()
*pushstack(char c)
---------------------------------------------------------
也就是这样:
#include
#include
typedef struct bracket
{char c;
struct bracket *next;
}BRACKET;
BRACKET *top=NULL;
BRACKET *pushstack(char c)
{BRACKET *p=(BRACKET*)malloc(sizeof(struct bracket));
p->c=c;
if(top==NULL)
{p->next=NULL;
top=p;}
else
{p->next=top;
top=p;
}
printf("%c\n",top->c);
return top;
}
BRACKET *popstack()
{BRACKET *p;
p=top;
if(top==NULL)
return top;
else
{top=top->next;
free(p);
return top;
}
}
int dispose(char *str)
{for(;*str;str++)
{printf("%c\n",*str);
if(*str=='('||*str=='{'||*str=='[')
pushstack(*str);
else if(*str==')')
{if(top->c=='(')
top=popstack();
else return 0;
}
else if(*str=='}')
{if(top->c=='{')
top=popstack();
else return 0;
}
else if(*str==']')
{if(top->c=='[')
top=popstack();
else return 0;
}
}
if(top==NULL)
return 1;
else
return 0;
}
main()
{char string[30];
int flag;
gets(string);
flag=dispose(string);
printf("\n%d",flag);
}
  • 3楼网友:我住北渡口
  • 2021-01-14 01:02
具体的我没有看明白你的程序,我记得以前做的时候是这样判断的,当遇到左括号的时候就让他入栈,当遇到右括号的时候就取出栈顶的值,检看是否匹配,直到字符串结束,有几种情况是不匹配的:1,取出栈顶的值与当前值不匹配,也就是说左右括号不匹配;2,当字符串结尾的时候栈不为空,也就是说左括号多余;3,当遇到右括号时栈为空,……,,,遇到这些情况后都表明字符串是不匹配的,不用再进行检验,所以直接返回,,
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息