栈括号匹配时,别的都正常,但“右括号多余”时,函数直接跳过了输入括号这一节,认为成功。这是为什么?怎么解决?
如果只做任意演示中的两个,没有问题。但完整执行现在的代码就是图中的情况。
```c++
#include <stdio.h>
#include <stdlib.h>
typedef char SElemType;
typedef int Status;
constexpr auto ERROR = 0;
constexpr auto OK = 1;
constexpr auto OVERFLOW = -2;
constexpr auto STACK_MAX_SIZE = 100;
typedef struct {
SElemType* base;
SElemType* top;
int stacksize;
}SqStack;
Status InitStack(SqStack& S)//建立空顺序栈
{
S.stacksize = STACK_MAX_SIZE;
S.base = (SElemType*)malloc(STACK_MAX_SIZE * sizeof(SElemType));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
return OK;
}
Status Push(SqStack& S, SElemType e)//入栈
{
if (S.top - S.base >= S.stacksize) exit(OVERFLOW);
*S.top = e;//注意S.top是指针型变量
S.top++;//先赋值,再加一
return OK;
}
Status Pop(SqStack& S, SElemType& e)//出栈
{
if (S.base == S.top) return ERROR;
S.top--;//注意S.top是指针型变量
e = *S.top;//先减一,再赋值
return OK;
}
Status March_Brackets(SqStack& S)
{
char ch;//输入一连串字符(括号),以回车结束.起初,括号都存储在ch中,栈S为空栈.
SElemType* s;
s = S.top-1;//s指向栈顶元素
printf("请输入字符:\n");
ch = getchar();//输入括号,进入循环
while (ch != '\n')//循环接收括号字符以回车为结束符,每输入一个括号,就进行一次判断。
{
if (ch =='(' || ch == '[' || ch == '{') //如果ch是左括号,入栈.栈中存放左括号,有匹配的右括号就出栈.若全部匹配成功,栈空。
Push(S, ch); //入栈
else if (ch == ')')//输入字符为右括号
{
if ((Pop(S, *s) == 0)) { printf("右括号多余,不匹配\n"); return ERROR; }
/*在Pop函数中, 若返回值为0, 说明是空栈.这有两种情况:1,还未输入左括号,第一个输入的就是右括号;
2,之前输入的左、右括号都已成功匹配,左括号已全部出栈*/
else if (*s != '(') { printf("右括号与左括号不匹配\n"); return ERROR; }
/*最后输入的左括号不是小括号,与输入的右小括号不匹配*/
}
else if (ch == ']')
{
if ((Pop(S, *s) == 0)) { printf("右括号多余,不匹配\n"); return ERROR; }
else if (*s != '[') { printf("右括号与左括号不匹配\n"); return ERROR; }
}
else if (ch == '}')
{
if ((Pop(S, *s) == 0)) { printf("右括号多余,不匹配\n"); return ERROR; }
else if (*s != '{') { printf("右括号与左括号不匹配\n"); return ERROR; }
}
ch = getchar();
}//循环结束,说明输入的右括号都有预支品牌的左括号.但这不意味着匹配成功!!还有左括号多余的可能。
if (S.top != S.base)//栈不空,说明有左括号未出栈,未匹配
{
printf("左括号多余,不匹配\n");
return ERROR;
}
else//栈空,说明左括号已全部出栈,匹配成功
{
printf("匹配完整,成功退出\n");
return OK;
}
}
int main(void)
{
printf("下面进入括号匹配\n");
printf("演示成功匹配\n");
SqStack B;
InitStack(B);
March_Brackets(B);
printf("演示括号不匹配\n");
SqStack P;
InitStack(P);
March_Brackets(P);
printf("演示右括号多余\n");
SqStack T;
InitStack(T);
March_Brackets(T);
/*printf("演示左括号多余\n");
SqStack R;
InitStack(R);
March_Brackets(R);
return 0;*/
}
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/048767717796157.png "#left")