中缀转后缀
对于普通中缀表达式的计算,我们可以将其转化为后缀表达式再进行计算。转换方法也十分简单。只要建立一个用于存放运算符的栈,扫描该中缀表达式:

(1)如果遇到数字,直接将该数字输出到后缀表达式(以下部分用「输出」表示输出到后缀表达式);
(2)如果遇到左括号,入栈;
(3)如果遇到右括号,不断输出栈顶元素,直至遇到左括号(左括号出栈,但不输出);
(4)如果遇到其他运算符,不断去除所有运算优先级大于等于当前运算符的运算符,输出。(5)最后,新的符号入栈;
(6)把栈中剩下的符号依次输出,表达式转换结束。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        // write code here
        unordered_map<string, int> opPriority;
        opPriority["*"] = 0;
        opPriority["+"] = 1;
        opPriority["-"] = 1;
        stack<string> stk; //操作符栈;
        vector<string> vec; //后缀表达式
        string digit;
        for(char ch:s){
            if(!(ch >= '0' && ch <= '9')){
                if(digit != ""){
                    vec.push_back(digit);
                    digit = "";
                }
            }
            if(ch >= '0' && ch <= '9') digit += ch;
            else if(ch == '('){
                string op = "";
                op += ch;
                stk.push(op);
            }else if(ch == ')'){
                while(!stk.empty() && stk.top() != "("){
                    vec.push_back(stk.top()); stk.pop();
                }
                stk.pop();
            }
            else{
                string op = "";
                op += ch;
                cout << op;
                while(!stk.empty() && stk.top() != "(" && opPriority[op] >= opPriority[stk.top()]){
                    vec.push_back(stk.top()); stk.pop();
                }
                stk.push(op);
            }
        }
        if(digit != "") vec.push_back(digit); //注意最后是数字需要加入后缀表达式

        while(!stk.empty()){
            vec.push_back(stk.top());
            stk.pop();
        }
        stack<int> resStk;
        for(int i = 0; i < vec.size(); i ++){
            if(vec[i] == "+"){
                int a = resStk.top(); resStk.pop();
                int b = resStk.top(); resStk.pop();
                resStk.push(a + b);
            }else if(vec[i] == "-"){
                int a = resStk.top(); resStk.pop();
                int b = resStk.top(); resStk.pop();
                resStk.push(b - a);
            }else if(vec[i] == "*"){
                int a = resStk.top(); resStk.pop();
                int b = resStk.top(); resStk.pop();
                resStk.push(b * a);
            }else resStk.push(stoi(vec[i]));
        }
        return resStk.top();
    }
};