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 74 75 76
| #include <iostream> #include <stack> #include <string> #include <unordered_map> using namespace std;
stack<int> num; stack<char> op;
unordered_map<char, int> h{ {'+', 1}, {'-', 1}, {'*',2}, {'/', 2} };
void eval() { int a = num.top(); num.pop();
int b = num.top(); num.pop();
char p = op.top(); op.pop();
int r = 0;
if (p == '+') r = b + a; if (p == '-') r = b - a; if (p == '*') r = b * a; if (p == '/') r = b / a;
num.push(r); }
int main() { string s; cin >> s;
for (int i = 0; i < s.size(); i++) { if (isdigit(s[i])) { int x = 0, j = i; while (j < s.size() && isdigit(s[j])) { x = x * 10 + s[j] - '0'; j++; } num.push(x); i = j - 1; } else if (s[i] == '(') { op.push(s[i]); } else if (s[i] == ')') { while(op.top() != '(') eval(); op.pop(); } else { while (op.size() && h[op.top()] >= h[s[i]]) eval(); op.push(s[i]); } } while (op.size()) eval(); cout << num.top() << endl; return 0; }
|