#include <cctype>
#include <functional>
#include <queue>
#include <stack>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        queue<char> q;
        for (auto &c: s) {
            q.push(c);
        }
        function<int()> recur = [&]() -> int {
            stack<int> st;
            char bef = '+';
            int num = 0;
            while (!q.empty()) {
                auto now = q.front();
                q.pop();
                if (isdigit(now)) {
                    num = num * 10 + (now - '0');
                }
                if (now == '(') {
                    num = recur();
                }
                if (!isdigit(now) || q.empty()) {
                    switch (bef) {
                        case '+': {
                            st.push(num);
                        } break;
                        case '-': {
                            st.push(-num);
                        } break;
                        case '*': {
                            st.top() *= num;
                        } break;
                    }
                    num = 0;
                    bef = now;
                }
                if (now == ')') {
                    break;
                }
            }
            int res = 0;
            while (!st.empty()) {
                res += st.top();
                st.pop();
            }
            return res;
        };
        return recur();
    }
};

思路:递归。

* 遇到左括号进入递归。

* 遇到右括号退出递归,返回值即为括号里的表达式值。

* 把加减当作正负数存在栈中,结束时一起运算。

* 乘法优先级高,所以遇到乘法时需要马上取出栈顶的数计算。