和上题差不多http://www.cnblogs.com/0summer/p/5837634.html
输入一个字符串,代表一个表达式,包含的运算符有+,-,*,/
本题没有包括括号,我的做法是把数字和+或者-压栈,继续遍历,如果遇到*或者/取出栈顶的数字和*或者/之后的数字进行计算然后再压栈,最后栈中剩下的就是所有+或者-表达式,再顺序计算一遍即可。
注释输入的字符串可能包含空格,要处理下
1 class Solution { 2 public: 3 int calculate(string s) { 4 int len=s.size(); 5 if(len==0) return 0; 6 stack<int> st; 7 int i=0; 8 int flag=1; 9 while(i<len){ 10 if(s[i]==‘ ‘){ 11 i++; 12 continue; 13 } 14 if(s[i]==‘+‘){ 15 flag=1; 16 st.push(flag); 17 } 18 else if(s[i]==‘-‘){ 19 flag=-1; 20 st.push(flag); 21 } 22 else if(s[i]==‘*‘||s[i]==‘/‘){ 23 char c=s[i]; 24 i++; 25 int num=0; 26 while(i<len&&s[i]==‘ ‘) i++; 27 while(i<len&&isdigit(s[i])){ 28 num=num*10+s[i]-‘0‘; 29 i++; 30 } 31 int tmp=st.top(); 32 st.pop(); 33 if(c==‘*‘) tmp*=num; 34 else tmp/=num; 35 st.push(tmp); 36 continue; 37 } 38 else if(isdigit(s[i])){ 39 int num=0; 40 while(i<len&&isdigit(s[i])){ 41 num=num*10+s[i]-‘0‘; 42 i++; 43 } 44 st.push(num); 45 continue; 46 } 47 i++; 48 } 49 int cnt=0; 50 vector<int> ans; 51 while(!st.empty()){ 52 cnt++; 53 ans.push_back(st.top()); 54 st.pop(); 55 } 56 int ret=ans[cnt-1]; 57 i=cnt-2; 58 while(i>0){ 59 ret+=ans[i]*ans[i-1]; 60 i-=2; 61 } 62 return ret; 63 } 64 };
时间: 2024-12-15 03:05:05