表達式的計算
阿新 • • 發佈:2017-09-11
不變 color cout () fix names while sin pac
- 分兩步:(1)中綴轉後綴;(2)計算後綴表達式
- (1)中綴轉後綴
- 操作數的順序不變;
- 從左到右掃描,遇到操作數直接輸出,遇到操作符,如果棧頂操作符的棧內優先級高於等於當前掃描操作符的入棧優先級,則該操作符出棧,負責掃描操作符入棧;
- 左括號特殊處理:入棧優先級最高,出棧優先級最低,除了右括號。
#include<iostream> #include<map> #include<stack> #include<string> using namespace std; string postFix(const string str) { map<char,int> isp; map<char,int> icp; // isp棧內優先級,icp入棧優先級 isp.insert(pair<char, int> (‘*‘,1)); isp.insert(pair<char, int> (‘/‘,1)); isp.insert(pair<char, int> (‘%‘,1)); isp.insert(pair<char, int> (‘+‘,2)); isp.insert(pair<char, int> (‘-‘,2)); isp.insert(pair<char, int> (‘(‘,3));isp.insert(pair<char, int> (‘)‘,4)); isp.insert(pair<char, int> (‘#‘,10)); icp.insert(pair<char, int> (‘(‘,0)); icp.insert(pair<char, int> (‘*‘,1)); icp.insert(pair<char, int> (‘/‘,1)); icp.insert(pair<char, int> (‘%‘,1)); icp.insert(pair<char, int> (‘+‘,2)); icp.insert(pair<char, int> (‘-‘,2)); icp.insert(pair<char, int> (‘)‘,4)); string pStr; stack<char> sta; sta.push(‘#‘); for (auto c : str) { if ((c >= ‘0‘ && c <= ‘9‘) || (c >= ‘a‘ && c <= ‘z‘)) { pStr.append(1, c); } else { if (c == ‘)‘) { char y = sta.top(); sta.pop(); while (y != ‘(‘) { pStr.append(1, y); y = sta.top(); sta.pop(); } } else { char y = sta.top(); sta.pop(); while (isp[y] <= icp[c]) { pStr.append(1, y); y = sta.top(); sta.pop(); } sta.push(y); sta.push(c); } } } while (!sta.empty()) { char y = sta.top(); sta.pop(); if (y != ‘#‘) { pStr.append(1, y); } } return pStr; } int main() { string str, pStr; cin>>str; pStr = postFix(str); cout<<pStr<<endl; return 0; }
- (2)後綴表達式的計算
- 從左到右掃描,將操作數入棧;
- 遇到操作符,從棧中取出兩個操作數,計算,結果入棧。
表達式的計算