2 qq 37262350 qq_37262350 于 2017.01.06 21:20 提问

求大神帮我看看这个简单的栈调用,新手程序媛不胜感激!

#include
#include
#include
#define STACK_SIZE 100
/*external variables*/
char contents[STACK_SIZE];
int top=0;
void make_empty(void);
bool is_empty(void);
bool is_full(void);
void push(char i);
char pop(void);
int stack_overflow(void);
void stack_underflow(void);
void read_line(char str[]);
int main(void)
{
int i,len;
make_empty();
printf("Enter parenteses and/or braces: ");
read_line(contents);
len=strlen(contents);
for(i=0;i<=len;i++)
{
switch(contents[i]){
case '(':push(contents[top]);
break;
case '{':push(contents[top]);
break;
case ')':if(pop()=='(')
break;
else{printf("Unmatched!");
goto END;}
case '}':if(pop()=='{')
break;
else{printf("Unmatched!");
goto END;}
case '\n':if(is_empty())
printf("Matched!");
else printf("Unmatched!");
}
}
END:
return 0;
}
void make_empty(void)
{
top=0;
}
bool is_empty(void)
{
return top==0;
}
bool is_full(void)
{
return top==STACK_SIZE;
}
void push(char i)
{
if (is_full())
{
stack_overflow();
}
else
contents[top++]=i;
}
char pop(void)
{
if (is_empty())
stack_underflow();
else
return contents[--top];
}
int stack_overflow(void)
{
printf("Stack overflow!");
return 1;
}
void stack_underflow(void)
{
printf("Stack underflow!");
}
void read_line(char str[])
{
int len,i=0;
do{if(i<STACK_SIZE)
str[i++]=getchar();
}while(str[i-1]!='\n');}请问为什么我输入()()的时候显示匹配,输入(){}的时候就显示不匹配了?我调试之后发现每次到}的时候程序就把pop()作为假了,我不知道为什么?请问是我的数组下标有问题吗?谢谢~

4个回答

ai977313677
ai977313677   2017.01.06 22:05
已采纳
case '\\{' : push(contents[top]);
case '\\}' : if(pop()=='{')

图片说明

ai977313677
ai977313677 双斜杠表示转义字符,这个书上应该会解释的很详细。
11 个月之前 回复
qq_37262350
qq_37262350 我才学C语言没有多久,不太懂这样改是什么意思,您可以跟我讲解一下吗?不过关于我的程序问题,我后来发现是因为我后面括号里的参数不对,应该改成contents[i],就对了,不过还是非常感谢你!
11 个月之前 回复
YXTS122
YXTS122   2017.01.06 23:44

自己多调试以后就能找出错误了。。。。。

ai977313677
ai977313677   2017.01.06 21:27

--top换成top--,应该就可以了

ai977313677
ai977313677   2017.01.06 22:03

刚才调试了一下你的程序,在case语句中
case '\{' :
case '\}' :
改成上面这样就行了。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!