利用递归解决括号问题:将括号中的字符串表达式看成子表达式,输入函数solve求值。

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        // write code here
        int num = 0, flag = 1, ff = 0;
        string ss = "";
        stack<int> snum;
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == '(') {
                if (ff > 0) ss = ss + s[i]; ///非最左侧的左括号,加入子表达式ss中
                ff += 1;
            } else if (s[i] == ')') {
                if (ff > 1) ss = ss + s[i]; //非最右侧的右括号,加入子表达式ss中
                ff -= 1;
                if (ff == 0) { //遇到最右侧的右括号,将子表达式ss输入到函数solve()求值(递归)
                    num = solve(ss);
                    ss = "";
                }
            } else if (ff != 0) {
                ss = ss + s[i];
            } else if (isdigit(s[i])) {
                num = num * 10 + (s[i] - '0');
            } else if (s[i] == '+') {
                snum.push(flag * num);
                flag = 1;
                num = 0;
            } else if (s[i] == '-') {
                snum.push(flag * num);
                flag = -1;
                num = 0;
            } else if (s[i] == '*') {
                flag = flag * num;
                num = 0;
            }
        }
        snum.push(flag * num);
        int out = 0;
        while (!snum.empty()) {
            out += snum.top();
            snum.pop();
        }
        return out;
    }
};