#include <stack>
#include <string>
using namespace std;

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        stack<int> nums;
        stack<char> ops;
        
        for (int i = 0; i < s.length(); i++) {
            char c = s[i];
            
            if (c == ' ') {
                continue; // 跳过空格
            }
            
            if (isdigit(c)) {
                // 解析完整数字
                int num = 0;
                while (i < s.length() && isdigit(s[i])) {
                    num = num * 10 + (s[i] - '0');
                    i++;
                }
                nums.push(num);
                i--; // 回退一位
            }
            else if (c == '(') {
                ops.push(c);
            }
            else if (c == ')') {
                // 计算括号内的所有运算
                while (!ops.empty() && ops.top() != '(') {
                    calculate(nums, ops);
                }
                ops.pop(); // 弹出左括号
            }
            else if (c == '+' || c == '-' || c == '*') {
                // 处理运算符优先级
                while (!ops.empty() && getPriority(ops.top()) >= getPriority(c)) {
                    calculate(nums, ops);
                }
                ops.push(c);
            }
        }
        
        // 处理剩余的运算
        while (!ops.empty()) {
            calculate(nums, ops);
        }
        
        return nums.top();
    }
    
private:
    // 获取运算符优先级
    int getPriority(char op) {
        if (op == '+' || op == '-') {
            return 1;
        } else if (op == '*') {
            return 2;
        }
        return 0; // 括号或其他
    }
    
    // 执行计算
    void calculate(stack<int>& nums, stack<char>& ops) {
        if (nums.size() < 2 || ops.empty()) return;
        
        char op = ops.top();
        ops.pop();
        int b = nums.top();
        nums.pop();
        int a = nums.top();
        nums.pop();
        int result = 0;
        
        switch (op) {
            case '+':
                result = a + b;
                break;
            case '-':
                result = a - b;
                break;
            case '*':
                result = a * b;
                break;
        }
        
        nums.push(result);
    }
};

这个解决方案的关键点:

1.双栈设计:
numbers栈:存储数字
operators栈:存储运算符和括号

2.运算符优先级:
* 的优先级最高(级别2)
+ 和 - 优先级相同(级别1)
( 优先级最低(级别0)

3.处理逻辑:
数字:直接压入数字栈
左括号:直接压入运算符栈
右括号:计算括号内的所有运算,直到遇到左括号
运算符:比较优先级,如果栈顶运算符优先级更高或相等,先计算栈顶运算

时间复杂度:O(n),每个字符只处理一次
空间复杂度:O(n),使用两个栈存储中间结果