takeiteasy_ 2022-01-03 14:30 采纳率: 93%
浏览 20
已结题

如何实现“若匹配成功则继续读入”

img


程序已经设计完了 就差匹配成功则继续读入这个步骤了,怎么做,有人指点一二吗

  • 写回答

3条回答 默认 最新

  • fuill 2022-01-03 15:01
    关注

    img

    #ifndef __MATCHBRACKETS_H__
    #define __MATCHBRACKETS_H__
    
    #include<stdio.h>
    #include<assert.h>
    #include<string.h>
    
    #define MaxSize 20
    
    typedef char SDataType;
    typedef struct Stack
    {
        int top;
        SDataType _arry[MaxSize];
    } Stack;
    
    void MatchBrackets(Stack* ps, int sz);
    int IsBrackets(char arry[], int i);
    int StackSize(Stack* ps);
    void StackPush(Stack* ps, SDataType data, char arry[]);
    void StackPop(Stack* ps);
    int StackEmpty(Stack* ps);
    void StackInit(Stack* ps);
    
    #endif //__MATCHBRACKETS_H__
    //#include"MatchBrackets.h"
    
    int IsBrackets(char arry[], int i)
    {
        if (('(' == arry[i]) || (')' == arry[i]) || ('[' == arry[i]) || (']' == arry[i]) || ('{' == arry[i]) || ('}' == arry[i]))
            return 1;//是括号
        else
            return 0;
    }
    
    int StackSize(Stack* ps)
    {
        assert(ps != NULL);
        return ps->top;
    }
    
    void StackPush(Stack* ps, SDataType data)
    {
        assert(ps != NULL);
        if (ps->top == MaxSize)
            return;
        else
        {
            ps->_arry[ps->top] = data;
            ps->top++;
        }
    }
    
    void StackPop(Stack* ps)
    {
        assert(ps != NULL);
        if (ps->top)
            ps->top--;
    
    }
    
    int StackEmpty(Stack* ps)
    {
        assert(ps != NULL);
        if (0 == ps->top)
            return 1;
        else
            return 0;
    }
    
    void StackInit(Stack* ps)
    {
        assert(ps != NULL);
        ps->top = 0;
    }
    
    void MatchBrackets(Stack* ps, int sz, char arry[])
    {
        int i = 0;
        int k = 0;//因为传的是指针,所以要定义一个形参
        assert(ps != NULL);
        //char ch = 0;
        while (i < sz)
        {
            if (IsBrackets(arry, i))//是括号
            {
                //如果是左括号,入栈
                if (('(' == arry[i]) || ('[' == arry[i]) || ('{' == arry[i]))
                {
                    StackPush(ps, arry[i]);
                    i++;
                    continue;
                }
                else if ((')' == arry[i]) || (']' == arry[i]) || ('}' == arry[i]))
                {
                    if (0 == ps->top)  //判断栈是否为空,若为空,则右括号比左括号多
                    {
                        printf("右括号比左括号多!\n");
                        return;
                    }
                    else
                    {
                        k = ps->top;
                        char ch = ps->_arry[--k];//error:ch = ps->_arry[--(ps->top)]---因为ps->top已经减1了,传递是指针,所以实参ps->top也-1了(此时ps->top已经指向栈顶了),但在下边要出栈(先-1,再出栈,出的就不是栈顶指针了,就会出错,所以我们要定义一个形参k,对形参的改变不会引起对实参的改变),
                        //如果右括号与左括号匹配,左括号出栈
                        if (((')' == arry[i]) && ('(' == ch)) ||
                                ((']' == arry[i]) && ('[' == ch)) ||
                                (('}' == arry[i]) && ('{' == ch)))
                        {
    
                            StackPop(ps);
                            i++;
                            continue;
                        }
                        else
                        {
                            printf("括号匹配出错!\n");
                            return;
                        }
                    }
                }
            }
            else   //不是括号,不用操作,直接向后走
            {
                i++;
            }
        }
        if (!StackEmpty(ps))
        {
            printf("左括号比右括号多!\n");
        }
        else
        {
            printf("匹配正确!\n");
        }
    
    }
    //#include"MatchBrackets.h"
    
    int main()
    {
        Stack s;
        int sz = 0;
        
        char ch[250];
        int n=250;
        while(n--)
        {
        StackInit(&s);
        scanf("%s",ch);
        getchar();
        sz = strlen(ch);
        MatchBrackets(&s, sz, ch);
        }
        
        
    
        return 0;
    }
    //参考:https://blog.csdn.net/huaijiu123/article/details/81806636
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月11日
  • 已采纳回答 1月3日
  • 创建了问题 1月3日

悬赏问题

  • ¥15 用FDTD计算并提取光栅结构的正负一级衍射光的光功率
  • ¥30 AVL fire DVI中的Design Explorer里面的Run的Status为什么总是Terminated?哪里出问题了?需要修改哪里?
  • ¥15 有二开IOT平台code的来搞钱了。
  • ¥15 求lingo语言编程以下内容
  • ¥15 cannot import name '_MissingValues' from 'sklearn.utils._param_validation'引用smoke
  • ¥15 求PHP跨站免登录技术
  • ¥15 AVL fire DVI中的Design Explorer里面的Objectives /Constraints的scale应该怎么设置
  • ¥15 qml如何绘制三维笛卡尔坐标系并向其中添加折线?
  • ¥15 咨询一个PYTHON的问题
  • ¥15 机器学习建模调参,roc评价指标