後綴表達式的計算ios
對後綴表達式進行計算,獲得表達式的值。算法
例若有後綴表達式:數據結構
2 1 + 3 *post
其結果應爲:spa
93d
後綴表達式:code
1 3 5 * + 7 9 / -blog
其結果應爲:ci
15.222get
後綴表達式:
1 3 + 5 7 - * 9 /
其結果應爲:
-0.889
後綴表達式計算程序以下:
// 後綴表達式的計算 #include <iostream> #include <sstream> #include <vector> #include <stack> #include <map> #include <string> using namespace std; void get_postfix(vector<string>& postf) { postf.clear(); string line; getline(cin, line); istringstream sin(line); string tmp; while (sin >> tmp) { postf.push_back(tmp); } } void init_op(map<string, int>& ops) { ops.clear(); ops["+"] = 100; ops["-"] = 100; ops["*"] = 200; ops["/"] = 200; ops["("] = 1000; ops[")"] = 0; } bool is_operator(const string& hs, const map<string, int>& ops) { map<string, int>::const_iterator cit = ops.find(hs);\ if (cit != ops.end()) { return true; } else { return false; } } double cal_post(const vector<string>& postf, const map<string, int>& ops) { stack<double> or_st; double operand = 0.0, a = 0.0, b = 0.0, c = 0.0; for (vector<string>::size_type i = 0; i != postf.size(); ++i) { if (!is_operator(postf[i], ops)) { operand = static_cast<double>(atof(postf[i].c_str())); or_st.push(operand); } else { switch (postf[i][0]) { case '+': b = or_st.top(); or_st.pop(); a = or_st.top(); or_st.pop(); c = a + b; or_st.push(c); break; case '-': b = or_st.top(); or_st.pop(); a = or_st.top(); or_st.pop(); c = a - b; or_st.push(c); break; case '*': b = or_st.top(); or_st.pop(); a = or_st.top(); or_st.pop(); c = a * b; or_st.push(c); break; case '/': b = or_st.top(); or_st.pop(); a = or_st.top(); or_st.pop(); c = a / b; or_st.push(c); break; default: break; } } } if (or_st.size() == 1) { return or_st.top(); } else { return -10000000000000.0; } } int main() { map<string, int> ops; init_op(ops); vector<string> postf; while (1) { get_postfix(postf); double ret = cal_post(postf, ops); cout << ret << endl << endl; } system("PAUSE"); return 0; }
上述後綴表達式計算過程當中用到了數據結構爲棧,該棧存儲的是中間結果的操做數。
數據結構:
0.設置一個棧,該棧用於存儲中間計算的操做數;
具體的算法邏輯爲:
1.從左到右順序掃描整個後綴表達式;
2.若是是操做數,則將該操做數壓入到棧中;
3.若是是操做符,則從棧中彈出對應的操做數,注意操做數的順序;根據操做符進行運
算,並將結果從新壓入到棧中;
4.直至將整個棧掃描完畢;
5.若是後綴表達式是合法的,則掃描完畢後,棧中只有一個元素,該元素的值即爲後綴
表達式的結果。