将一个字符串的运算式子转化为最后的输出结果的,这个就很像之前学过的表达式,所以显而易见的可以利用栈来存储的计算。
利用栈的先进后出,计算式子的值,当遇到左括号的时候就保存现场,包括数字的值和符号的值,当遇到右括号的时候就需要恢复现场了,这个时候就需要去除之前所保存的值并且进行计算的。
class Solution { public: int calculate(string s) { int res=0,sign=1,n=s.size(); stack<int> st; for(int i=0;i<n;i++){ if(s[i]>='0'){ int num=0; while(i<n&&s[i]>='0'){ num=num*10+s[i++]-'0'; } res+=sign*num; i--; }else if(s[i]=='+'){ sign=1; }else if(s[i]=='-'){ sign=-1; }else if(s[i]=='('){ st.push(res); st.push(sign); res=0; sign=1; }else if(s[i]==')'){ res*=st.top(); st.pop(); res+=st.top(); st.pop(); } } return res; } };
因为栈可以利用递归来进行实现的,那么可以利用一个变量cnt来记录括号的性质,返回的就是所计算的结果的,最后遇到符号的时候就计算结果并且恢复原来的值。
class Solution { public: int calculate(string s) { int res=0,num=0,sign=1,n=s.size(); for(int i=0;i<n;i++){ char c=s[i]; if(c>='0'&&c<='9'){ num=10*num+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=='-' || i==n-1){ res+=sign*num; num=0; sign=(c=='+')?1:-1; } } return res; } };