【LeetCode-栈/数学】基本计算器 II
题目描述
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例:
输入: "3+2*2"
输出: 7
输入: " 3/2 "
输出: 1
输入: " 3+5 / 2 "
输出: 5
说明:
- 你可以假设所给定的表达式都是有效的。
- 请不要使用内置的库函数 eval。
题目链接: https://leetcode-cn.com/problems/basic-calculator-ii/
思路
使用一个栈 nums 存储计算的中间结果,使用变量 preOpr 记录前一个运算符,假设当前数字是 cur:
- 如果 preOpr=='+',则将 cur 入栈;
- 如果 preOpr=='-',则将 -cur 入栈;
- 如果 preOpr=='*',因为 * 的优先级比加减高,所以将 nums 栈顶元素乘以 cur;
- 如果 preOpr=='/',因为 / 的优先级比加减高,所以将 nums 栈顶元素除以 cur;
这样的话,将字符串遍历一遍,栈中就会存储一些中间结果。我们将栈中的中间结果全部相加就是最终的答案。
代码如下:
class Solution {
public:
int calculate(string s) {
if(s.empty()) return 0;
stack<int> nums;
char preOpr = '+';
int cur = 0;
s += "#"; // 表示字符串结束,最后一个数字进入else分支
for(int i=0; i<s.size(); i++){
if(s[i]==' ') continue;
if(isdigit(s[i])){
cur = cur * 10 + (s[i] - '0');
}else{
if(preOpr=='+') nums.push(cur);
else if(preOpr=='-') nums.push(-cur);
else if(preOpr=='*') nums.top() *= cur;
else if(preOpr=='/') nums.top() /= cur;
cur = 0;
preOpr = s[i];
}
}
int ans = 0;
while(!nums.empty()){
ans += nums.top();
nums.pop();
}
return ans;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)