递归题目,求表达式的值

求当前字符串s表达式的值,实现需要用栈依次存储数字:
如果当前state是‘+',求push(num)
如果是'-', 就push(-num)
如果是'*',就将栈顶的元素乘以num即可
一开始的时候state定义为'+',相当于0 +
处理数字值:
if('0' <= s[i] && s[i] <= '9'){
    sum = sum * 10 + (s[i] - '0');
}
这部分代码表示的是求整个括号的值,因为()的优先级最高,所以遇到括号直接处理:
[left, right]区间表示的是括号内的内容; 不包含括号,如果包含括号就死循环了,然后sum = solve(.....)递归处理出括号里面的值
if(s[i] == '('){
    int count = 1;
    int left = ++ i;
    while(count > 0){
        if(s[i] == '(') count ++;
        if(s[i] == ')') count --;
        i ++;
    }
    i --;
    int right = i - 1;
    sum = solve(s.substr(left, right - left + 1));
}
当s[i]为运算符号时,就得将当前的sum加入栈中, 是正是负或是乘取决于现在的state而不是s[i], s[i]表示的是下一个num的符号
或者是最后一个字符时,当到达最后一个字符(最后一个字符一定是数字,如果是括号那早就处理掉了),所以也得放入栈中
if(s[i] == '+' || s[i] == '-' || s[i] == '*' || i == (int)s.size() - 1){
    if(state == '+') sta.push(num);
    else if(state == '-') sta.push(-num);
    else sta.top() *= num;
    state = s[i];
    num = 0;
}
,最后累加栈里面的值并返回
int res = 0;
while(sta.size()){
    res += sta.top();
    sta.pop();
}
总代码:
class Solution {
public:
    int solve(string s) {
        int sum = 0;
        char state = '+';
        stack<int> sta;
        for(int i = 0; i < (int)s.size(); i ++){
            if('0' <= s[i] && s[i] <= '9'){
                sum = sum * 10 + (s[i] - '0');
            }
            if(s[i] == '('){
                int count = 1;
                int left = ++ i;
                while(count > 0){
                    if(s[i] == '(') count ++;
                    if(s[i] == ')') count --;
                    i ++;
                }
                i --;
                int right = i - 1;
                sum = solve(s.substr(left, right - left + 1));
            }
            if(s[i] == '+' || s[i] == '-' || s[i] == '*' || i == (int)s.size() - 1){
                if(state == '+') sta.push(num);
                else if(state == '-') sta.push(-num);
                else sta.top() *= num;
                state = s[i];
                num = 0;
            }
        }
        int res = 0;
        while(sta.size()){
            res += sta.top();
            sta.pop();
        }
        return res;
    }
};