224. 基本计算器
给你一个字符串表达式 s,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()。
示例1:
输入: ( s="1+1" )
输出: 2
示例2:
输入: ( s="2-1+2" )
输出: 3
示例3:
输入: ( s="(1+(4+5+2)-3)+(6+8)" )
输出: 23
提示:
- ( 1 \leq s.length \leq 3 \times 10^5 )
- s由数字、'+'、'-'、'('、')'、和空格组成
- s表示一个有效的表达式
- '+'不能用作一元运算(例如,"+1"和"+(2+3)"无效)
- '-'可以用作一元运算(即"-1"和"-(2+3)"是有效的)
- 输入中不存在两个连续的操作符
- 每个数字和运行的计算将适合于一个有符号的 32位整数
java
class Solution {
public int calculate(String s) {
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1);
int v = 1;
int ans = 0;
int i = 0;
while (i < s.length()) {
char c = s.charAt(i);
// 只处理非空格
if (c != ' ') {
if (c == '+') {
v = stack.peek();
} else if (c == '-') {
v = -stack.peek();
} else if (c == '(') {
stack.push(v);
} else if (c == ')') {
stack.pop();
} else {
int num = 0;
while (i < s.length() && Character.isDigit(s.charAt(i))) {
num = num * 10 + s.charAt(i) - '0';
i++;
}
ans = ans + v * num;
continue;
}
}
i++;
}
return ans;
}
}
解题思路:这道题的官方题解写得比较绕,虽然是使用栈的方法解题,但是并不需要将具体需要计算的数字压入栈中。栈只对加减号±操作,使用栈结构将所有的括号去除,例如-(1-(2-(3-4)))
其实可以化简为-1+2-3+4
此时直接扫描计算即可,每当遇到正负号和左右括号时都需要对栈做相关的处理,遇到+
时当前位置真正的运算符号和栈顶符号相同,-
时相反。遇到(
时将符号压入栈中,)
时出栈。