class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    stack<int> nums;
    stack<char> ops;
    // 辅助函数:计算栈顶的两个数
    void eval() {
        if(nums.size() < 2 || ops.empty()) return;
        int b = nums.top(); nums.pop();
        int a = nums.top(); nums.pop();
        char c = ops.top(); ops.pop();
        
        int res = 0;
        if (c == '+') res = a + b;
        else if (c == '-') res = a - b;
        else if (c == '*') res = a * b;
        nums.push(res);
    }

    // 定义优先级
    int precedence(char op) {
        if (op == '+' || op == '-') return 1;
        if (op == '*') return 2;
        return 0;
    }

    int solve(string s) {
        // 清空栈(如果类被复用)
        while(!nums.empty()) nums.pop();
        while(!ops.empty()) ops.pop();

        for (int i = 0; i < s.size(); i++) {
            char c = s[i];
            // 1. 处理数字
            if (isdigit(c)) {
                int num = 0;
                // 向后读取直到非数字
                while (i < s.size() && isdigit(s[i])) {
                    num = num * 10 + (s[i] - '0');
                    i++;
                }
                nums.push(num);
                i--; // 因为for循环还会i++,这里需要回退一格
            }
            // 2. 处理左括号
            else if (c == '(') {
                ops.push(c);
            }
            // 3. 处理右括号
            else if (c == ')') {
                // 计算直到遇到左括号
                while (!ops.empty() && ops.top() != '(') {
                    eval();
                }
                if(!ops.empty()) ops.pop(); // 弹出 '('
            }
            // 4. 处理运算符 (+ - *)
            else {
                // 核心逻辑:当 栈顶优先级 >= 当前优先级,先计算栈顶
                // 例如:栈里是 *,当前是 +,必须先算 *
                while (!ops.empty() && ops.top() != '(' && precedence(ops.top()) >= precedence(c)) {
                    eval();
                }
                ops.push(c);
            }
        }

        // 5. 处理剩余的运算符
        while (!ops.empty()) {
            eval();
        }

        return  nums.top();
    }
};