-
-
Notifications
You must be signed in to change notification settings - Fork 8.9k
/
Copy pathSolution.java
73 lines (69 loc) · 1.93 KB
/
Solution.java
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
65
66
67
68
69
70
71
72
73
class Solution {
private int i;
private String expr;
private Map<String, Deque<Integer>> scope = new HashMap<>();
public int evaluate(String expression) {
expr = expression;
return eval();
}
private int eval() {
char c = expr.charAt(i);
if (c != '(') {
return Character.isLowerCase(c) ? scope.get(parseVar()).peekLast() : parseInt();
}
++i;
c = expr.charAt(i);
int ans = 0;
if (c == 'l') {
i += 4;
List<String> vars = new ArrayList<>();
while (true) {
String var = parseVar();
if (expr.charAt(i) == ')') {
ans = scope.get(var).peekLast();
break;
}
vars.add(var);
++i;
scope.computeIfAbsent(var, k -> new ArrayDeque<>()).offer(eval());
++i;
if (!Character.isLowerCase(expr.charAt(i))) {
ans = eval();
break;
}
}
for (String v : vars) {
scope.get(v).pollLast();
}
} else {
boolean add = c == 'a';
i += add ? 4 : 5;
int a = eval();
++i;
int b = eval();
ans = add ? a + b : a * b;
}
++i;
return ans;
}
private String parseVar() {
int j = i;
while (i < expr.length() && expr.charAt(i) != ' ' && expr.charAt(i) != ')') {
++i;
}
return expr.substring(j, i);
}
private int parseInt() {
int sign = 1;
if (expr.charAt(i) == '-') {
sign = -1;
++i;
}
int v = 0;
while (i < expr.length() && Character.isDigit(expr.charAt(i))) {
v = v * 10 + (expr.charAt(i) - '0');
++i;
}
return sign * v;
}
}