class Solution { public: long nextNum(string s, int& i){ long num; int base=0; while(i<s.length()&&s[i]>='0'&&s[i]<='9') num = num*pow(10, base++)+(s[i++]-'0'); return num; } void compute(stack<long>& numStack, stack<char>& charStack){ long num1=numStack.top(); numStack.pop(); long num2=numStack.top(); numStack.pop(); if(charStack.top()=='+') numStack.push(num1+num2); if(charStack.top()=='-') numStack.push(num2-num1); charStack.pop(); } int calculate(string s) { stack<long> numStack; stack<char> charStack; int i=0; while(i<s.length()){ char c = s[i]; if(c=='+'||c=='-'){ charStack.push(c); i++; continue; } if(c=='('){ charStack.push(c); i++; continue; } if(c==')'){ charStack.pop(); if(!charStack.empty()&&(charStack.top()=='+'||charStack.top()=='-')) compute(numStack, charStack); i++; continue; } if(c>='0'&&c<='9'){ long num = nextNum(s, i); numStack.push(num); if(!charStack.empty()&&(charStack.top()=='+'||charStack.top()=='-')) compute(numStack, charStack); continue; } if(c==' '){ i++; continue; } } return numStack.top(); } };