思路:
- 式子里面有空格,不是标准的计算式,先洗一遍数据,后面好处理。
- 用栈的方式进行计算过程,例如23+24-7/9+22-4+12;
(1)相当于+23+24-7/9+22-4+12。
(2)用栈进行数据积累的过程,先计算除法和乘法,加法和减法先不计算,只是正负号入栈。
(3)遇到乘除,都是用栈顶元素进行计算的过程。
(4)注意最后一个数也必须加入计算,因为最后一个数值之后没有计算符
(5)遇到符号才是上一个完整计算的过程,使用的是上一个计算符
(+) 23 + 2 * 4 - 7 / 9 + 22 - 4 + 1 * 2
+ | * | - | / | + | - | + | * | s.size()-1 |
---|---|---|---|---|---|---|---|---|
1*2入栈&&1出栈 | ||||||||
+1 | ||||||||
-4 | ||||||||
+22 | ||||||||
-7/9入栈&&-7入栈 | ||||||||
-7 | ||||||||
2*4入栈&&2出栈 | ||||||||
+2 | ||||||||
(+)23 |
计算符号每次用的都是上一个
代码
int calculate(string s) {
vector<long> result;
int r;
long num=0;
string s1="";
int sl =s.length(),i;
//洗数据
for(i=0;i<sl;i++)
if(s[i]!=' ')
s1.push_back(s[i]);
int s1l=s1.length();
//默认第一个为+
char flag = '+';
for(i=0;i<s1l;i++){
//可能会有多位数据
if(s1[i]<='9'&&s1[i]>='0')
num = num *10 +s1[i]-'0';
//一个符号之前是一个完整的计算,要保证最后一个数也要被计算
if(s1[i]>'9'||s1[i]<'0'||i==s1l-1){
cout<<"i="<<i<<" "<<"num="<<num<<endl;
switch (flag)
{
case '+':
result.push_back(num);
break;
case '-':
result.push_back(-num);
break;
case '*':
r = result.back()*(num);
result.pop_back();
result.push_back(r);
break;
case '/':
r = result.back()/(num);
result.pop_back();
result.push_back(r);
break;
}
flag = s1[i];
num = 0;
}
}
//#include <numeric>特有的库函数
return accumulate(result.begin(),result.end(),0);
}