class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
     // string-》int,读取s中连续的数字
    int str2Int(string s, int &index) {
        string tmpstr;
        while(s[index] <= '9' && s[index] >= '0') {
            tmpstr += s[index++];
        }
        return stoi(tmpstr);
    }
    
    // 计算
    void calc(stack<int> &val, stack<char> &ops) {
        int val1 = val.top();
        val.pop();
        int val2 = val.top();
        val.pop();
        char c = ops.top();
        ops.pop();
        switch (c) {
            case '+' : val.push(val1 + val2); break;
            case '-' : val.push(val2 - val1); break;
            case '*' : val.push(val1 * val2); break;
            default: break;
        }
    }
    
    int solve(string s) {
        stack<int> val;
        stack<char> ops;
        for (int i = 0; i <= s.length(); ) {
            if (s[i] >= '0' && s[i] <= '9') {
                val.push(str2Int(s, i)); // 将数字存入stack val中
            } else if (ops.empty() || ops.top() == '(' || s[i] == '(') {
                ops.push(s[i++]); // 将操作符存入stack ops中
            } else if (s[i] == '*') { // 遇到*,及时相乘
                int val1 = val.top(), val2 = str2Int(s, ++i);
                val.pop();
                val.push(val1 * val2);
            } else { // 剩下的都是加减乘数
                calc(val, ops);  // 计算
                if (s[i] == ')') {
                    ops.pop();
                    i++;
                } else if (i == s.length()){
                    break;
                }
            }
        }
        return val.top();
    }
};