-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcalculator.cpp
More file actions
70 lines (60 loc) · 1.54 KB
/
Copy pathcalculator.cpp
File metadata and controls
70 lines (60 loc) · 1.54 KB
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
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char* argv[]){
unordered_map<char,int> prio = {
{'+', 0},
{'*', 1}
};
auto less =
[&](char l, char r){
return prio[l] < prio[r];
};
auto isOp =
[&](char c){
return prio.find(c) != prio.end();
};
auto eval =
[](int v1, int v2, char Op){
cout << "eval " << v1 << ", " << v2 << ", " << Op << '\n';
switch (Op){
case '+':
return v1+v2;
break;
case '*':
return v1*v2;
break;
default:
cout << "error no handled op " << Op << "\n";
return 0;
}
};
stack<int> val; stack<char> op;
auto reduce =
[&](){
while(op.size()){
char opr = op.top();
op.pop();
int v1 = val.top(); val.pop();
int v2 = val.top(); val.pop();
val.push(eval(v1,v2,opr));
}
};
string exp = argc > 1 ? argv[1] : "2*1+5";
for (char c : exp){
if (!isOp(c)){
val.push(c-'0');
}else{
if (op.size() == 0){
op.push(c); continue;
}
char prevOp = op.top();
if (less(c, prevOp)){ // e.g. + after *
reduce();
}
op.push(c);
}
}
reduce();
cout << val.top() << '\n';
return 0;
}