给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
1 <= s.length <= 3 * 105
s 由整数和算符 (‘+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数
这题跟上一个题很像,但由于我想用Deque,对出队的函数不熟悉导致一直没排查到bug。
class Solution {
//初始化优先级
HashMap<Character, Integer> mp_priority = new HashMap<>() {{
put('*', 2);
put('/', 2);
put('+', 1);
put('-', 1);
}};
public int calculate(String s) {
Deque<Integer> stack_num = new LinkedList<>();
Deque<Character> stack_sign = new LinkedList<>();
int num = 0;
s = s.replace(" ", "");
stack_num.add(0);
for (int i = 0; i < s.length(); i++) {
//先考虑是数字,则入数字栈
if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
num = 0;
while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
num = num * 10 + s.charAt(i) - '0';
i++;
}
i--;
stack_num.add(num);
//再考虑符号
} else {
//当符号栈顶优先级大于要入栈的符号优先级,先将前面计算,注意这里使用Deque当栈,一定要用Last
while (!stack_sign.isEmpty() && mp_priority.get(stack_sign.peekLast()) >= mp_priority.get(s.charAt(i))) {
int y = stack_num.pollLast();
int x = stack_num.pollLast();
char op = stack_sign.pollLast();
if (op == '*') {
stack_num.add(x * y);
} else if (op == '/') {
stack_num.add(x / y);
} else if (op == '+') {
stack_num.add(x + y);
} else {
stack_num.add(x - y);
}
}
stack_sign.add(s.charAt(i));
}
}
while (!stack_sign.isEmpty()) {
int y = stack_num.pollLast();
int x = stack_num.pollLast();
char op = stack_sign.pollLast();
if (op == '*') {
stack_num.add(x * y);
} else if (op == '/') {
stack_num.add(x / y);
} else if (op == '+') {
stack_num.add(x + y);
} else {
stack_num.add(x - y);
}
}
return stack_num.peekLast();
}
}