这道题只有7个字符,数字只有一位不算太难
先算乘除,后算加减,考试的时候就是这样做的,用stack完美解决
但如果加大难度....
1) 数字允许有多位比如 1314-521*233
2) 再比如如果有括号呢 -1-(1-(-9))
让我们按照函数化的思想逐渐完善我们的代码
(1) 7个字符版本
#include <iostream> #include <algorithm> #include <stack> using namespace std; int get_ans (string str) { stack <int> s; int flag=1; for (int i=0;i<str.size();i++) { if (str[i]>=‘0‘&&str[i]<=‘9‘) s.push( flag*(str[i]-‘0‘)); else if (str[i]==‘-‘ || str[i]==‘+‘) { if (str[i]==‘-‘) flag=-1; else flag=1; }
#include <iostream> #include <algorithm> #include <stack> using namespace std; int get_num(string str,int &k) { // 从k开始一直读所有的数字字符 int ans=0; for (;k<str.size();k++) { if (str[k]>=‘0‘ && str[k]<=‘9‘) ans=ans*10+str[k]-‘0‘; else break; } k--; // i 此时指向最后一个数字的位置 return ans; } int get_ans (string str) { stack <int> s; int flag=1; for (int i=0;i<str.size();i++) { if (str[i]>=‘0‘&&str[i]<=‘9‘) { int num=get_num(str,i); s.push(flag*num); } else if (str[i]==‘-‘ || str[i]==‘+‘) { if (str[i]==‘-‘) flag=-1; else flag=1; } else { char ch=str[i]; int x1=s.top(); s.pop(); i++; int x2=get_num(str,i); if (ch==‘/‘) s.push(x1/x2); else s.push(x1*x2); } } int sum=0; while (!s.empty()) { sum+=s.top(); s.pop(); } return sum; } int main () { int T; cin>>T; while (T--) { string str; cin>>str; cout<<get_ans(str)<<endl; } return 0; }
int x1=s.top(); s.pop(); i++; // importment !! int x2=str[i]-‘0‘; if (str[i-1]==‘/‘) s.push(x1/x2); else s.push(x1*x2); } } int sum=0; while (!s.empty()) { sum+=s.top(); s.pop(); } return sum; } int main () { int T; cin>>T; while (T--) { string str; cin>>str; cout<<get_ans(str)<<endl; } return 0; }
允许输入连续的数字233, 我们只需要加一个输入接口
原文:https://www.cnblogs.com/xidian-mao/p/10588813.html