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; } };