C++主要是参考官方题解写的,递归还是有点懵

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    vector<int> cal(string s, int idx) {
        stack<int> num;
        char op = '+';
        int a = 0;
        int i;
        for (i=idx; i<s.size(); i++) {
            if (isdigit(s[i])) {
                int j;
                for (j = i; j < s.size() && isdigit(s[j]); j++);
                a = stoi(s.substr(i, j - i));
                i = j; // 数字后面接的符号
            }
            if (s[i]=='(') {
                vector<int> r = cal(s, i+1);
                a = r[0];
                i = r[1];
                // cout << a << ' ' << i << endl;
                if (i != s.size()-1) continue; // 不能少
            }
            switch (op) {
                case '+':
                    num.push(a); break;
                case '-':
                    num.push(-a); break;
                case '*':
                    a *= num.top(); num.pop();
                    num.push(a); break;
            }
            if (s[i]==')') break;
            else op = s[i];
        }
        int sum=0;
        while (!num.empty()) {
            // cout << num.top() << endl;
            sum += num.top();
            num.pop();
        }
        return vector<int> {sum, i};
    }

    int solve(string s) {
        // write code here
        // 要求:1. 运算符号有优先级 * > +- ;2. 支持括号
        // 遍历字符串:遇到
        // 数字 - 将连续数字字符转为 int
        // 运算符 - 若为 + 则数字正常入栈,若为 - 则相反数入栈,
        //        - 若为 * 则栈顶出栈、与栈顶相乘后的结果入栈
        // 左括号 - 进入子递归,遇右括号,返回 int 入栈;
        return cal(s, 0)[0];
    }
};