-
-
Notifications
You must be signed in to change notification settings - Fork 8.9k
/
Copy pathSolution.cpp
65 lines (61 loc) · 1.61 KB
/
Solution.cpp
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
class Solution {
public:
int i = 0;
string expr;
unordered_map<string, vector<int>> scope;
int evaluate(string expression) {
expr = expression;
return eval();
}
int eval() {
if (expr[i] != '(') return islower(expr[i]) ? scope[parseVar()].back() : parseInt();
int ans = 0;
++i;
if (expr[i] == 'l') {
i += 4;
vector<string> vars;
while (1) {
string var = parseVar();
if (expr[i] == ')') {
ans = scope[var].back();
break;
}
++i;
vars.push_back(var);
scope[var].push_back(eval());
++i;
if (!islower(expr[i])) {
ans = eval();
break;
}
}
for (string v : vars) scope[v].pop_back();
} else {
bool add = expr[i] == 'a';
i += add ? 4 : 5;
int a = eval();
++i;
int b = eval();
ans = add ? a + b : a * b;
}
++i;
return ans;
}
string parseVar() {
int j = i;
while (i < expr.size() && expr[i] != ' ' && expr[i] != ')') ++i;
return expr.substr(j, i - j);
}
int parseInt() {
int sign = 1, v = 0;
if (expr[i] == '-') {
sign = -1;
++i;
}
while (i < expr.size() && expr[i] >= '0' && expr[i] <= '9') {
v = v * 10 + (expr[i] - '0');
++i;
}
return sign * v;
}
};