栈的应用 表达式求值

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

                                  而我还在这找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;
    }
}






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



原文地址:https://www.cnblogs.com/zhanyeye/p/9746129.html