class Solution {
public:
// 根据逆波兰表达式求解结果
int evalRPN(vector<string>& tokens) {
    stack<int> nums;
        int n = tokens.size();
        for (int i = 0; i < n; i++) {
            if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
                int num2 = nums.top();
                nums.pop();
                int num1 = nums.top();
                nums.pop();
                if (tokens[i] == "+") nums.push(num1 + num2);
                if (tokens[i] == "-") nums.push(num1 - num2);
                if (tokens[i] == "*") nums.push(num1 * num2);
                if (tokens[i] == "/") nums.push(num1 / num2);
            }
            else nums.push(std::stoi(tokens[i])); // 字符串转化为int
        }
        return nums.top();
}
// 转化为逆波兰表达式
vector<string> toRPN(string& s) {
    unordered_map<string, int> priority; // 哈希表
    priority["+"] = 1; // 设定优先级,乘除高于加减,左括号优先级最低
    priority["-"] = 1;
    priority["*"] = 2;
    priority["/"] = 2; 
    priority["("] = 0;

    vector<string> res;
    stack<string> ops;
    if (!s.length()) return res; // 表达式为空直接返回

    s.insert(0, 1, '(');  // 表达式字符串开头结尾加入括号 保证全部符号可以出栈
    s.push_back(')');
    int n = s.length();

    for (int i = 0; i < n; i++) {
        if (s[i] == ' ') continue; // 表达式字符串有空格直接跳出循环 
        // 处理数字
        if (s[i] >= '0') {
            string cur = "";
            while (i < n && s[i] >= '0') { 
                cur += s[i];
                i++;
            }
            res.push_back(cur); // 将数字存放在res中
            i--;  //循环时,i指向的下一个符号
        }
        // 处理括号的不同情况
        if (s[i] == '(') ops.push("("); // 左括号直接入栈
        else if (s[i] == ')') { // 右括号到左括号符号全部出栈
            while (ops.top() != "(") {
                res.push_back(ops.top()); // 将括号中的符号出栈且存放在res中
                ops.pop(); 
            }
            ops.pop(); // 把"(" pop
        }
        // 处理+-*/四种情况,当前优先级最高时
        else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
            if (ops.empty() || priority[string(1, s[i])] > priority[ops.top()]) ops.push(string(1, s[i]));//栈空或优先级比栈顶元素优先级高,直接入栈
            else { // 当前优先级比较低,栈中符号出栈,直到满足上面入栈要求
                while (!ops.empty()) {
                    string op = ops.top(); // 
                    if (priority[op] >= priority[string(1, s[i])]) {
                        res.push_back(op);
                        ops.pop();
                    }
                    else break;
                }
                ops.push(string(1, s[i])); // 栈为空 返回
            }
        }
    }
    return res;
}
int solve(string s) {
        // write code here
        vector<string> tokens = toRPN(s);
        return evalRPN(tokens);
    }
};