class Solution {
public:
    unordered_map<char, int> mp={  //设定优先级,用于判断
        {'+', 1},
        {'-', 1},
        {'*', 2}
    };
  
    //使用两个栈,一个放数字,一个放操作字符,一个操作字符对应两个数字,在字符栈中只允许后一个操作符高于前一个操作符存在
    int solve(string s) {  
        s.erase(remove(s.begin(), s.end(), ' '), s.end());  //去掉空格;
 
        int size = s.length();
        stack<int> nums;
        stack<char> ops;

        for(int i=0; i<size; i++){   //每位处理
            char c = s[i];
            if(c == '('){    //左括号时,记录
                ops.push(c);
            }else if(c == ')'){  //右括号,处理与左括号之间的操作
                while(ops.top() != '('){
                    cal(nums, ops);  //处理函数
                }
                if(!ops.empty())ops.pop();  //弹出左括号;
            }else{
                if(isdigit(c)){  //当时数字时,多位数字的字符进行合并
                    int u=0, j = i;  //u是总和,是要得到的数
                    while(j < size && isdigit(s[j])){
                        u = u*10 + (s[j++] - '0'); //对之前的u进行加和
                    }
                    nums.push(u);
                    i = j-1;
                }else{
                    if(i>0 && (s[i-1] == '-' || s[i-1] == '+' || s[i-1] == '(') ){  //对存在+-4的情况,转变成+0-4
                        nums.push(0);
                    }
                    while(!ops.empty() && ops.top() != '(' && mp[ops.top()] >= mp[c]){
                        cal(nums, ops);  //当遇到-或+的前面是*或+或-,*遇到*,都对之前的操作符进行处理,也就是后面遇到优先级低或者相等的情况;
                    }
                    ops.push(c);
                }
            }
        }

        while(!ops.empty()){  //处理剩余
            cal(nums, ops);
        }
        return nums.top();
    }

    void cal(stack<int>& nums, stack<char>& ops){
        if(nums.size()<2 || ops.empty())return;

        int b = nums.top();nums.pop();
        int a = nums.top();nums.pop();
        char op = ops.top();ops.pop(); //一个操作符配两个操作数

        int res = 0;
        if(op == '+')res = a+b;
        else if(op == '-')res = a-b;
        else if(op == '*')res = a*b; //直接判断匹配
 
        nums.push(res); //加入总和数
    }
};