这道题就可以结合Basic Calculator中的两种做法了,分别是括号运算和四则运算的,则使用stack作为保持的结果,而使用递归来处理括号内的值的。
class Solution { public: int calculate(string s) { int num=0,res=0,n=s.size(); stack<int> st; char op='+'; for(int i=0;i<n;i++){ char c=s[i]; if(c>='0' && c<='9'){ num=num*10+c-'0'; }else if(c=='('){ int j=i,cnt=0; for(;i<n;i++){ if(s[i]=='(') cnt++; if(s[i]==')') cnt--; if(cnt==0) break; } num=calculate(s.substr(j+1,i-j-1)); } if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/' || i==n-1){ if(op=='+') st.push(num); if(op=='-') st.push(-num); if(op=='*' || op=='/'){ int temp=(op=='*')?(st.top()*num):(st.top()/num); st.pop(); st.push(temp); } op=s[i]; num=0; } } while(!st.empty()){ res+=st.top(); st.pop(); } return res; } };
当然这个地方也是可以进行一个变化的,不使用栈,而是考虑用一个变量来保存上一个值的,即栈顶的值,然后继续进行处理的。
class Solution { public: int calculate(string s) { int res=0,num=0,last=0,n=s.size(); char op='+'; for(int i=0;i<n;i++){ char c=s[i]; if(c>='0'&&c<='9'){ num=num*10+c-'0'; } else if(c=='('){ int j=i,cnt=0; for(;i<n;i++){ if(s[i]=='(') cnt++; if(s[i]==')') cnt--; if(cnt==0) break; } num=calculate(s.substr(j+1,i-j-1)); } if(c=='+' || c=='-' ||c=='*' ||c=='/' ||i==n-1){ if(op=='+') last+=num; if(op=='-') last-=num; if(op=='*') last*=num; if(op=='/') last/=num; if(c=='+'||c=='-'||i==n-1){ res+=last; last=0; } op=c; num=0; } } return res; } };