- #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);//結果入stack
- }
- 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);//數字入stack
- i = j - 1;
- }
- //左括號無優先級,直接入stack
- else if (s[i] == '(')//左括號入stack
- {
- op.push(s[i]); }
- //括號特殊,遇到左括號直接stack,遇到右括號計算括號裡面的
- else if (s[i] == ')')//右括號
- {
- while(op.top() != '(')//一直計算到左括號
- eval();
- op.pop();//左括號出stack
- }
- else
- {
- while (op.size() && h[op.top()] >= h[s[i]])//待入stack運算符優先級低,則先計算
- eval();i
- op.push(s[i]);//操作符入stack
- }
- }
- while (op.size()) eval();//剩餘的進行計算
- cout << num.top() << endl;//輸出结果
- return 0;
- }
複製代碼 |