将每个数字和符号分开看,维护一个标识preSign始终表示数字前面的运算符号,在维护一个栈,正数直接入栈,负数加一个 - 号后入栈,乘除与栈顶元素直接运算并更新其值。最后栈中存的就是每一部分的运算结果,相加即可得出最终答案。
class Solution {
public:
int calculate(string s) {
int len = s.length();
int num = 0;
char preSign = '+';//表示该数字前面的符号
vector<int> stk;
for(int i = 0;i<len;i++) {
if(s[i]>='0'&&s[i]<='9') {
num = num*10 + (s[i] - '0');//记得加括号
}
if((!isdigit(s[i])&&s[i]!=' ')||(i==len-1)) {//i==len-1是说最后一个元素是数字的话还没有运算,要进入运算
switch(preSign) {
case '+':stk.emplace_back(num);break;//数字前面是+号直接入栈
case '-':stk.emplace_back(-num);break;
case '*':stk.back() *= num;break;
case '/':stk.back() /= num;break;
}
preSign = s[i];
num = 0;
}
}
for(size_t i = 0;i<stk.size();++i) {
num+=stk[i];
}
return num;
}
};