不老赫本 2021-10-03 17:13 采纳率: 100%
浏览 2007
已结题

假设一个算术表达式中可以包含三种括号:园括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用

假设一个算术表达式中可以包含三种括号:园括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。

  • 写回答

2条回答 默认 最新

  • 关注
    
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    #define maxsize 100
    
    int flag = 0;
    char useless;
    
    //定义顺序表结构
    typedef struct {
        string s;
        int length;
    }SeqList;//不要定义成指针,否则你必须开辟空间
    
    //定义堆栈
    typedef struct {
        int top;
        char elem[maxsize];
    }Stack;
    
    //初始化顺序表
    void initList(SeqList& L) {
        L.length = 0;
    }
    
    //初始化堆栈
    void initStack(Stack& S) {
        S.top = -1;
    }
    
    //输入创建顺序表
    void createList(SeqList& L) {
        cin >> L.s;
        //L->length = sizeof(L->s)-1;sizeof函数结果包含'\0'
        L.length = L.s.length();
    }
    
    //入栈
    bool push(Stack &S,char ch) {
        if (S.top == maxsize - 1) {
            return false;
        }
        S.top++;
        S.elem[S.top] = ch;
        return true;
    }
    
    //出栈
    bool pop(Stack &S, char &ch) {
        if (S.top == -1) {
            return false;
        }
        ch = S.elem[S.top];
        S.top--;
        return true;
    }
    
    bool isEmpty(Stack S){
        return S.top == -1;
    }
    
    char topElem(Stack S) {
        return S.elem[S.top];
    }
    
    void matchBracket(Stack& S, char lbracket) {
        while (S.elem[S.top] != lbracket) {
            pop(S, useless);
        }
        pop(S, useless);
        flag--;
    }
    
    //检测算法
    bool checkExp(SeqList L, Stack S) {
        int i = 0;
        int count = L.length;
        //char useless;int flag = 0;
        while (count--) {
            if (L.s[i] >= '0' && L.s[i] <= '9') {//当前是数字
                i++;
                continue;
            }
            else {//当前是符号,包括运算符、左括号和右括号
                if (L.s[i] == '(' || L.s[i] == '[' || L.s[i] == '{') {
                    push(S, L.s[i]);
                    flag++;
                }
                else if(L.s[i] =='+' || L.s[i]=='-' || L.s[i] == '*' || L.s[i] == '/'){
                    char top = topElem(S);
                    if (top == '+' || top == '-' || top == '*' || top == '/') {//if(top == '(' || ....)
                        pop(S, useless);
                    }
                    else {
                        push(S, L.s[i]);
                    }
                }
                else if(L.s[i] == ')' || L.s[i] == ']' || L.s[i] == '}'){//当前是右括号
                    if (flag > 0) {
                        if (L.s[i] == ')') {
                            matchBracket(S, '(');
                        }
                        else if (L.s[i] == ']') {
                            matchBracket(S, '[');
                        }
                        else {
                            matchBracket(S, '{');
                        }
                    }
                    else {
                        return false;
                    }
                }
                else {
                    cout << "输入的字符有误" << endl;
                    return false;
                }
            }
            i++;
        }
        if (isEmpty(S)) {
            return true;
        }
        else {
            char top = topElem(S);
            if (top == '+' || top == '-' || top == '*' || top == '/') {
                return true;
            }
            else {//栈顶是左括号
                return false;
            }
        }
    }
    
    //[5+(6-3)]-(2+3)]
    //flag记录栈内含有左括号的个数,当flag为0但当前扫描到的字符为右括号,则匹配错误
    int main() {
        SeqList l;
        Stack s;
        initList(l);
        initStack(s);
        createList(l);
    
        if (checkExp(l, s)) {
            cout << "yes" << endl;
        }
        else {
            cout << "no" << endl;
        }
    
    }
    
    

    img

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

报告相同问题?

问题事件

  • 系统已结题 10月12日
  • 已采纳回答 10月4日
  • 创建了问题 10月3日

悬赏问题

  • ¥50 关于#html5#的问题:H5页面用户手机返回的时候跳转到指定页面例如(语言-javascript)
  • ¥15 无法使用此凭据登录,因为你的域不可用,如何解决?(标签-Windows)
  • ¥15 yolov9的训练时间
  • ¥15 二叉树遍历没有报错但无法正常运行
  • ¥15 在linux系统下vscode运行robocup3d上场球员报错
  • ¥15 Python语言实验
  • ¥15 SAP HANA SQL 增加合计行
  • ¥20 用C#语言解决一个英文打字练习器,有偿
  • ¥15 srs-sip外部服务 webrtc支持H265格式
  • ¥15 在使用abaqus软件中,继承到assembly里的surfaces怎么使用python批量调动