LeetCode 224. Basic Calculator

Basic Calculator

由于只需要实现加减和括号,除了括号不需要考虑运算的优先级,所以可以直接one pass做。

思路是将 a-b 等价为 a+(-b),这样所有的运算都是加法,而负号只要乘以后面的数即可。

建立一个stack,遇到左括号时,压栈迄今为止的和以及括号前的符号。遇到对应右括号时,括号内已经计算完毕,这时我们将括号内计算得到的sum*栈顶的符号,再加上栈内前面部分的和即可。

class Solution {
public:
    int calculate(string s) {
        // a-b <=> a+(-b)
        int res=0, sign=1;
        stack<int> st;
        
        for (int i=0;i<s.size();++i){
            char ch=s[i];
            if (isdigit(ch)){
                int num=0;
                while (i<s.size() && isdigit(s[i])){
                    num = num*10 + (s[i++]-'0');
                }
                --i;
                res += sign*num;
            }else if (ch=='+' || ch=='-'){
                sign = ch=='+'?1:-1;
            }else if (ch=='('){
                st.push(res);
                st.push(sign);
                res = 0;
                sign = 1;
            }else if (ch==')'){
                res *= st.top(); st.pop();
                res += st.top(); st.pop();
            }
        }
        return res;
    }
};

猜你喜欢

转载自www.cnblogs.com/hankunyan/p/11276993.html