这道题和 282. Expression Add Operators(http://blog.csdn.net/revoir/article/details/51167848) 非常相似。把相乘和相除集体看成一个计算单元,加减分隔开的计算单元一个个的放到memo里面。这个方法要过两遍。
int calculate(string s) {
vector<int> memo;
char sign='+';
for(int i=0;i<s.size();++i){
int num=0;
if(s[i]>='0'&&s[i]<='9'){
while(i<s.size()&&s[i]>='0'&&s[i]<='9'){
num=num*10+s[i]-'0';
++i;
}
if(sign=='+')
memo.push_back(num);
else if(sign=='-')
memo.push_back(-num);
else {
int temp=memo.back();
memo.pop_back();
if(sign=='*')
memo.push_back(temp*num);
if(sign=='/'){
if(num==0)
return INT_MAX;
memo.push_back(temp/num);
}
}
--i;
num=0;
}
else if(s[i]!=' ') sign=s[i];
}
int res=0;
for(auto i:memo) res+=i;
return res;
}
另外我还见到了一个超级简洁的方法。我是写不出来,贴上来学习一下吧
nt calculate(string s) {
istringstream in(s + "+");
long long total = 0, term, sign = 1, n;
in >> term;
char op;
while (in >> op) {
if (op == '+' || op == '-') {
total += sign * term;
sign = 44 - op; //op == '+' ? 1 : -1
in >> term;
} else {
in >> n;
if (op == '*')
term *= n;
else
term /= n;
}
}
return total;
}