0%

基本计算器II

基本计算器 II

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

1
2
输入:s = "3+2*2"
输出:7

思路: 维护一个操作符栈和操作数栈以及操作符优先级字典. 流程如下: 遇到数字入栈,遇到操作符,如果优先级小于已入栈的操作符, 计算之前大于该操作符的操作,并将计算结果入栈操作数栈. 然后入栈新操作符,重复以上操作. 最终返回操作符栈剩下的结果即可.

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class Solution {
public int calculate(String s) {
Stack<Integer> nums = new Stack();
Stack<Character> ops = new Stack();
StringBuilder sb = new StringBuilder();
Map<Character, Integer> pmap = new HashMap();
pmap.put('+', 1);
pmap.put('-', 1);
pmap.put('*', 2);
pmap.put('/', 2);
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c == ' ') {
if(!sb.isEmpty()) {
nums.push(Integer.parseInt(sb.toString()));
sb = new StringBuilder();
}
continue;
}
if(pmap.containsKey(c)) {
if(!sb.isEmpty()) {
nums.push(Integer.parseInt(sb.toString()));
sb = new StringBuilder();
}
if(ops.isEmpty()) {
ops.push(c);
}else {
while(!ops.isEmpty() && pmap.get(ops.peek()) >= pmap.get(c)) {
int v2 = nums.pop();
int v1 = nums.pop();
nums.push(calc(v1, v2, ops.pop()));
}
ops.push(c);
}
} else {
sb.append(c);
}
}
if(!sb.isEmpty()) {
nums.push(Integer.parseInt(sb.toString()));
}
while(!ops.isEmpty()){
int v2 = nums.pop();
int v1 = nums.pop();
nums.push(calc(v1, v2, ops.pop()));
}
return nums.pop();
}

public int calc(int v1, int v2, char op) {
switch(op) {
case '+':
return v1 + v2;
case '-':
return v1 - v2;
case '*':
return v1 * v2;
case '/':
return v1 / v2;
default:
return 0;
}
}
}