给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = "3+2*2"
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
提示:
1 <= s.length <= 3 * 10^5
s
由整数和算符('+', '-', '*', '/')
组成,中间由一些空格隔开s
表示一个 有效表达式- 表达式中的所有整数都是非负整数,且在范围
[0, 2^31 - 1]
内 - 题目数据保证答案是一个 32-bit 整数
解答
相较于 224. 基本计算器主要区别在于没有括号,而添加了乘除号。由于乘除号只改变乘除号左右两侧相邻数字的优先级,因而仍然可以从左到右遍历,将遍历到的数字存储在一个栈中,每当遍历到一个加减号时,就将后面的那个数字入栈;遍历到乘除号时,就将运算符前面的那个数(即栈顶),与下一个遍历到的数字进行相应计算,再将运算结果替换栈顶:
class Solution {
public:
int calculate(string s) {
if(s.empty())
return 0;
int len = s.size();
int i = 0;
vector<int> nums;
// 当前遍历的数字
int num = 0;
char preOp = '+';
while(i < len){
if(s[i] <= '9' && s[i] >= '0'){
num = num * 10 + (s[i] - '0');
}
// 注意最后一个数要入栈
if( (s[i] < '0' || s[i] > '9') && s[i] != ' ' || i == len - 1){
if(preOp == '+'){
nums.push_back(num);
}
else if(preOp == '-'){
nums.push_back(-num);
}
else if(preOp == '*'){
nums.back() *= num;
}
else if(preOp == '/'){
nums.back() /= num;
}
preOp = s[i];
num = 0;
}
i++;
}
return accumulate(nums.begin(), nums.end(), 0);
}
};