题目
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
示例
输入:s = "1 + 1"
输出:2
提示
- 1 <= s.length <= 3 * 105
- s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成
- s 表示一个有效的表达式
题解
- 双栈,一个栈存储数字,另外一个栈存储运算符
- 计算的顺序:有括号先算括号内,然后再按照顺序计算
- 在遍历表达式过程中可能遇到以下情况
:空格则跳过
+ || -
:加号或者减号0~9
:数字则向后遍历,将该数字取完(
:左括号,括号开始,要先算括号内的计算结果,记录之前的计算结果并初始化)
:右括号,括号结束,将括号内的计算结果与之前的计算结果做运算
参考代码
class Solution {
public int calculate(String s) {
int len = s.length();
Stack<Integer> stackNum = new Stack<>();
Stack<Integer> stackOpera = new Stack<>();
int sign = 1;
int res = 0;
for(int i = 0; i < len; i++) {
if(s.charAt(i) == ' ') {
continue;
}
if(s.charAt(i) == '+') {
sign = 1;
} else if(s.charAt(i) == '-') {
sign = -1;
} else if(s.charAt(i) == '(') {
stackOpera.push(sign);
stackNum.push(res);
sign = 1;
res = 0;
} else if(s.charAt(i) == ')') {
res = stackNum.pop() + res * stackOpera.pop();
} else {
int num = s.charAt(i) - '0';
while(i < len - 1 && Character.isDigit(s.charAt(i+1))) {
num = num * 10 + (s.charAt(++i) - '0');
}
res += sign * num;
}
}
return res;
}
}