用栈实现四则运算

//************ 课本53页,用栈来实现的简单的四则运算表达式. '#'是表达式结束符,
              注意在表达式输入完毕后需再输入一个'#'表示结束.  eg:4+2*3-10/5#   **********//
#include<stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <stack>
using namespace std;
stack<int> opnd;        //操作数栈
stack<char> optr;        //算符栈
char expression[100];    //用于盛放表达式
char Compare(char a, char b);            //返回两算符a和b的优先级关系
int Calculate(int a, int b, char op);    //返回计算结果
int EvaluateExpression();                //求值过程
bool IsOptr(char c);                    //是否是算符
int main(){
    optr.push('#');                        //在表达式最左边增设一个'#'构成整个表达式的一对'#'
    while(scanf("%s", expression) != EOF)
        cout<<EvaluateExpression()<<endl;
    return 0;
}
char Compare(char a, char b){            //返回两算符a和b的优先级关系
    if('#' == a)
        if('#' == b)
            return '=';
        else
            return '<';
    if('+'==a || '-'==a)
        if('*'==b || '/'==b || '('==b)
            return '<';
        else
            return '>';

    if('*'==a || '/'==a)
        if('(' == b)
            return '<';
        else
            return '>';

    if('(' == a)
        if(')' == b)
            return '=';
        else
            return '<';
}
int Calculate(int a, int b, char op)    //返回计算结果
{
    switch(op)    {
        case '+':
            return a+b;
        case '-':
            return a-b;
        case '*':
            return a*b;
        case '/':
            return a/b;
    }
}
bool IsOptr(char c){
    static string oprator("+-*/()#");
    if(oprator.find(c) == string::npos)
        return false;    //不是算符
    return true;        //是算符
}
int EvaluateExpression(){                //求值过程
    int i=0, num=0;
    while(expression[i]!='#' || optr.top()!='#'){
        if(!IsOptr(expression[i])){
    //不是算符,则是操作数
            num = 0;
            while(!IsOptr(expression[i]))
            {    //求得此操作数
                num *= 10;
                num += expression[i]-'0';
                ++i;
            }
            opnd.push(num);
        }
        else{
            switch(Compare(optr.top(), expression[i])){
                case '<':
                    optr.push(expression[i]);
                    ++i;
                    break;
                case '=':
                    optr.pop();
                    ++i;
                    break;
                case '>':
                    int a = opnd.top(); opnd.pop();
                    int b = opnd.top(); opnd.pop();
                    opnd.push(Calculate(b, a, optr.top()));    //注意这里a和b的顺序
                    optr.pop();
                    break;
            }
        }
    }
    optr.push('#');        //在表达式最左边增设一个'#'构成整个表达式的一对'#'
    int res=opnd.top();
    opnd.pop();
    return res;
}
原文地址:https://www.cnblogs.com/13224ACMer/p/5036640.html