计算表达式 C++题解

注意:
  • 符号栈首先压入'#',字符串最后添加'$',保证所有运算符都用于运算。
  • 栈顶运算符优先级小于当前运算符优先级时,当前运算符入栈;否则进行二元运算。
  • 字符串型数字读取:while循环读入数字字符并转换为数字类型,注意循环时的进位操作。
  • 由于存在除法,所有数字都设为double型!!!不然debug很长时间也找不到bug。
#include<iostream>
#include<stack>
#include<string>

using namespace std;

int getLevel(char ch){
    int level;
    if(ch == '#')
        level =  0;
    else if(ch == '$')
        level =  1;
    else if(ch == '+' || ch == '-')
        level =  2;
    else if(ch == '*' || ch == '/')
        level =  3;
    return level;
}

double calculate(double x, double y, char ch){
    double res;
    if(ch=='+')
        res = x + y;
    else if(ch=='-')
        res = x - y;
    else if(ch=='*')
        res = x * y;
    else if(ch=='/')
        res = x / y;
    return res;
}

int main(){
    string str;
    while(getline(cin,str)){
        str += '$';
        int index = 0;
        stack<double> num;
        stack<char> op;
        op.push('#');
        while(index<str.length()){
            if(isdigit(str[index])){
                double number = 0;
                while(isdigit(str[index])){
                    number = number*10 + str[index] - '0';
                    index++;
                }
                num.push(number);
            }else{
                char ch = str[index];
                if(getLevel(op.top())<getLevel(ch)){
                    op.push(ch);
                    index++;
                }
                else{
                    double y = num.top();
                    num.pop();
                    double x = num.top();
                    num.pop();
                    double res = calculate(x, y ,op.top()); 
                    num.push(res);
                    op.pop();
                }
                
            }
        }
        cout << num.top() << endl;
    }
    return 0;
}