风落平川 2023-10-19 12:24 采纳率: 96.8%
浏览 9
已结题

C语言利用栈实现括号匹配时,连续执行出现异常:不进入循环

栈括号匹配时,别的都正常,但“右括号多余”时,函数直接跳过了输入括号这一节,认为成功。这是为什么?怎么解决?
如果只做任意演示中的两个,没有问题。但完整执行现在的代码就是图中的情况。


```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")

展开全部

  • 写回答

2条回答 默认 最新

  • 风落平川 2023-10-19 12:35
    关注

    如果前两次都执行了匹配成功,第三次就没问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月20日
  • 已采纳回答 10月20日
  • 创建了问题 10月19日

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部