Skip to content

Commit dea3835

Browse files
committed
227.基本计算器II,双栈,哈希表
1 parent 8d07114 commit dea3835

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
221. 最大正方形
106106
224. 基本计算器
107107
226. 翻转二叉树
108+
227. 基本计算器 II
108109
232. 用栈实现队列
109110
234. 回文链表
110111
236. 二叉树的最近公共祖先

leetcode_Java/DoneType.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@
206206
165. 比较版本号(双指针,字符串分割)
207207
208. 实现 Trie (前缀树)
208208
224. 基本计算器(双栈)
209+
227. 基本计算器 II(双栈,哈希表)
209210
394. 字符串解码(栈)
210211
415. 字符串相加(模拟相加)
211212
438. 找到字符串中所有字母异位词(滑动窗口,双指针)

leetcode_Java/Solution0227.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// 227. 基本计算器 II
2+
3+
4+
/*
5+
在“224. 基本计算器”的基础上进阶
6+
1、支持 + - * / ^ % ( ) 的完全表达式问题
7+
2、用map存放运算符的优先级,只有「栈内运算符」比「当前运算符」优先级高或同等,才能进行运算
8+
*/
9+
class Solution {
10+
Map<Character, Integer> map = new HashMap<>(){{
11+
put('+', 1);
12+
put('-', 1);
13+
put('*', 2);
14+
put('/', 2);
15+
put('%', 2);
16+
put('^', 3);
17+
}};
18+
19+
public int calculate(String s) {
20+
Deque<Character> opsStack = new ArrayDeque<>();
21+
Deque<Integer> numsStack = new ArrayDeque<>();
22+
numsStack.push(0);
23+
s = s.replaceAll(" ", "");
24+
int n = s.length();
25+
char[] charArray = s.toCharArray();
26+
for (int i = 0; i < n; i++) {
27+
char c = charArray[i];
28+
if (c == '(') {
29+
opsStack.push(c);
30+
} else if (c == ')') {
31+
while (!opsStack.isEmpty() && opsStack.peek() != '(') {
32+
cal(numsStack, opsStack);
33+
}
34+
opsStack.pop();
35+
} else if (Character.isDigit(c)) {
36+
int j = i, num = 0;
37+
while (j < n && Character.isDigit(charArray[j])) {
38+
num = num * 10 + charArray[j++] - '0';
39+
}
40+
numsStack.push(num);
41+
i = j - 1;
42+
} else {
43+
if (i > 0 && charArray[i - 1] == '(') {
44+
numsStack.push(0);
45+
}
46+
while (!opsStack.isEmpty() && opsStack.peek() != '(' && map.get(opsStack.peek()) >= map.get(c)) {
47+
cal(numsStack, opsStack);
48+
}
49+
opsStack.push(c);
50+
}
51+
}
52+
while (!opsStack.isEmpty()) {
53+
cal(numsStack, opsStack);
54+
}
55+
return numsStack.peek();
56+
}
57+
58+
private void cal(Deque<Integer> numsStack, Deque<Character> opsStack) {
59+
if (numsStack.isEmpty() || numsStack.size() < 2 || opsStack.isEmpty()) {
60+
return;
61+
}
62+
int b = numsStack.pop(), a = numsStack.pop();
63+
char op = opsStack.pop();
64+
int res = 0;
65+
if (op == '+') {
66+
res = a + b;
67+
} else if (op == '-') {
68+
res = a - b;
69+
} else if (op == '*') {
70+
res = a * b;
71+
} else if (op == '/') {
72+
res = a / b;
73+
} else if (op == '%') {
74+
res = a % b;
75+
} else if (op == '^') {
76+
res = (int) Math.pow(a, b);
77+
}
78+
numsStack.push(res);
79+
}
80+
}

0 commit comments

Comments
 (0)