• 栈的应用 表达式求值


    后天考概率论了,
     Σ(|||▽||| ) 

                                      而我还在这找bug,

                                             ≥﹏≤ 

                                                                                          好在是最后终于成功了   啊  哈哈哈!!!

                                                                                                              (๑>؂<๑) 


    注意操作数只能是一位数哦!!!!

    输入表达式时要切换成英文括号哦!!!

    这里实用的栈是数组构成,就不像书上那样什么    抽象数据类型定义了   的啦


    #include <iostream>
    
    using namespace std;
    
    #define MAXSIZE 50
    
    char EvaluateExpression();               //表达式求值
    bool In(char ch);                        //判断输入字符ch是否为运算符
    char Precede(char a,char b);             //比较优先级
    char Operate(char a,char opera,char b);  //二元运算
    
    
    int main()
    {
        int a=EvaluateExpression();
        cout<<a;
        return 0;
    }
    
    
    char EvaluateExpression()  //表达式求值
    {
        int a,b,c;
        char ch;
        int i=-1,j=-1;//栈的计数器
        char OPND[MAXSIZE];//操作数栈
        char OPTR[MAXSIZE];//操作符栈
    
        cout<<"请输入计算公式:"<<endl<<"例如格式为a*(b+c)="<<endl;
    
        cin>>ch;
        OPTR[++i]='=';
        while(ch!='='||OPTR[i]!='=')  //仅当ch为'='并且栈OPTR中只有'='时停止循环
        {
            if(!In(ch)) //如果不是操作符
            {
                OPND[++j]=ch;
                cin>>ch;
            }
            else
                switch(Precede(OPTR[i],ch))
                {
                case '<':
                    OPTR[++i]=ch;
                    cin>>ch;
                    break;
                case '>':
                    b=OPND[j--];  //OPND出栈
                    a=OPND[j--];  //OPND出栈
                    c=Operate(a,OPTR[i--],b);  //OPTR出栈参与a与b的运算
                    OPND[++j]=c;
                    break;
                case '=':
                    i--; //OPTR出栈
                    cin>>ch;
                    break;
                }
        }
        return (OPND[j]-48);
    }
    
    bool In(char ch)//判断输入字符ch是否为运算符
    {
        if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='=')
            return true;
        else
            return false;
    }
    
    char Precede(char a,char b)  //比较优先级
    {
        if(a=='('&&b==')' || a=='='&&b=='=')
            return '=';
        else if(a=='('||a=='='||b=='(' || (a=='+'||a=='-')&&(b=='*'||b=='/'))
            return '<';
        else
            return '>';
    
    }
    
    char Operate(char a,char opera,char b) //二元运算
    {
        switch(opera)
        {
        case '+':
            return (a-'0')+(b-'0')+48;
        case '-':
            return (a-'0')-(b-'0')+48;
        case '*':
            return (a-'0')*(b-'0')+48;
        case '/':
            return (a-'0')/(b-'0')+48;
        }
    }
    






    马上要考概率论了,祝自己好运๑乛◡乛๑



  • 相关阅读:
    准备重启blog。。。
    愿我成功省一。
    [LUOGU]P5502 [JSOI2015]最大公约数
    [LUOGU]P3400 仓鼠窝
    [LUOGU]P5149 会议座位
    OI退役记
    新开博客园~~
    1108 模拟赛
    牛客1102
    题解 CF21B 【Intersection】
  • 原文地址:https://www.cnblogs.com/zhanyeye/p/9746129.html
Copyright © 2020-2023  润新知