中綴轉字尾並計算(多位數)
阿新 • • 發佈:2018-12-21
#中綴轉字尾並計算值
輸入一個包含+、-、*、和圓括號地正確表示式,輸出表達式、它的字尾表示式和計算後的值。 思路:將輸入的計算表示式存放在一個string中,在利用字串的功能將計算表示式中的數字和操作符分開存放在vector容器中,然後將中綴轉換成字尾,利用棧來計算表示式。
#include <stdio.h> #include<stack> #include<vector> #include<sstream> #include<string> using namespace std; vector<string> covertingInfixToRPN(vector<string>& exp) //中綴轉字尾 { vector<string> c; stack<string> op; string ch; for(int i=0;i<exp.size();i++) { if(exp[i] =="(") op.push(exp[i]); else if(exp[i] ==")") while(1) { ch = op.top(); op.pop(); if(ch != "(") c.push_back(ch); else break; } else if(exp[i] =="+" || exp[i] =="-") { while(op.size()>0 && op.top() != "(") { c.push_back(op.top()); op.pop(); } op.push(exp[i]); } else if(exp[i] =="*"|| exp[i] =="/") { while(op.size()>0&&(op.top() == "*"|| op.top() == "/" )) { c.push_back(op.top()); op.pop(); } op.push(exp[i]); } else c.push_back(exp[i]) ; } while(op.size()>0) { c.push_back(op.top()); op.pop(); } for(int j=0;j<c.size()-1;j++) cout << c[j] << " "; cout << c.back() << endl; return c; } int stringToInt(const string& it)//將字串轉換成數字 { int ints; stringstream stream(it); stream >> ints; return ints; } int calculate(vector<string> c)//計算字尾表示式 { stack<int> res; int temp1,temp2,result; for(int i=0;i<c.size();i++) { if(c[i][0]<='9' && c[i][0]>='0')//判斷是否是純數字 res.push(stringToInt(c[i])); else { temp1 = res.top(); res.pop(); temp2 = res.top(); res.pop(); if(c[i] == "+") res.push(temp2+temp1); else if(c[i] == "-") res.push(temp2-temp1); else if(c[i] == "*") res.push(temp2*temp1); else if(c[i] == "/") res.push(temp2/temp1); } } return res.top(); } vector<string> process(const string& it)//將輸入的字串處理,將數字和字元分開 { vector<string> temp; for(int i=0;i<it.length();i++) { if(it[i]<='9' && '0'<=it[i]) { int j; for( j=i+1;j<it.length();j++) { if(it[j]<'0' || it[j]>'9') break; } temp.push_back(it.substr(i,j-i)); i=j-1; } else temp.push_back(it.substr(i,1)); } return temp; } int main() { string s; vector<string> formula; int result,number; cin >> s; formula = process(s); cout << s << endl; vector<string> rpn; rpn = covertingInfixToRPN(formula); result = calculate(rpn); cout << result; return 0; }