遇到* 和( 正常入符号栈,遇到+ 和- ,计算前面所有的表达式值,遇到) 计算符号栈到( 前的表达式值

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        // write code here
        stack<int> num,op;
        auto calpre = [=,&num,&op](bool f){
            while(!op.empty() && op.top() != '('){
                int pre = num.top();num.pop();
                int tai = num.top();num.pop();
                if(op.top() == '+') num.push(pre+tai);
                else if(op.top() == '-')num.push(tai-pre);
                else num.push(pre*tai);
                op.pop();
            }
            if(f && !op.empty() && op.top() == '(') op.pop(); 
        };
        for(int i=0;i<s.size();){
            if( isdigit(s[i]) ){
                int n = atoi(s.c_str()+i);
                num.push(n);
                while(isdigit(s[i])) i++;
            }else if(s[i] == '*' || s[i] == '('){
                op.push(s[i++]);
            }else if(s[i] == '+' || s[i] == '-'){
                calpre(false);op.push(s[i++]);
            }else{
                calpre(true);i++;
            }
        }
        calpre(false);
        return num.top();
    }
};