使用堆疊評估表示式的 C++ 程式
為了解數學表示式,我們需要字首形式還是字尾形式。將中綴轉換為字尾後,我們需要字尾求值演算法來找到正確的答案。
我們還可以使用堆疊資料結構來求解字尾表示式。
當從字尾表示式中找到一些運算元時,將它們壓入堆疊。當找到一些運算元時,則從堆疊中彈出兩個項,然後按正確的順序執行操作。之後,結果也將被壓入堆疊以備將來使用。在完成整個表示式後,最終結果也會儲存在堆疊頂上。
Input: Postfix expression: 53+62/*35*+ Output: The result is: 39
演算法
postfixEvaluation(字尾)
輸入:要評估的字尾表示式。
輸出:評估字尾形式後的答案。
Begin for each character ch in the postfix expression, do if ch is an operator , then a := pop first element from stack b := pop second element from the stack res := b a push res into the stack else if ch is an operand, then add ch into the stack done return element of stack top End
示例程式碼
#include<iostream> #include<cmath> #include<stack> using namespace std; float scanNum(char ch) { int value; value = ch; return float(value-'0'); //return float from character } int isOperator(char ch) { if(ch == '+'|| ch == '-'|| ch == '*'|| ch == '/' || ch == '^') return 1; //character is an operator return -1; //not an operator } int isOperand(char ch) { if(ch >= '0' && ch <= '9') return 1; //character is an operand return -1; //not an operand } float operation(int a, int b, char op) { //Perform operation if(op == '+') return b+a; else if(op == '-') return b-a; else if(op == '*') return b*a; else if(op == '/') return b/a; else if(op == '^') return pow(b,a); //find b^a else return INT_MIN; //return negative infinity } float postfixEval(string postfix) { int a, b; stack<float> stk; string::iterator it; for(it=postfix.begin(); it!=postfix.end(); it++) { //read elements and perform postfix evaluation if(isOperator(*it) != -1) { a = stk.top(); stk.pop(); b = stk.top(); stk.pop(); stk.push(operation(a, b, *it)); }else if(isOperand(*it) > 0) { stk.push(scanNum(*it)); } } return stk.top(); } main() { string post = "53+62/*35*+"; cout << "The result is: "<<postfixEval(post); }
輸出
The result is: 39
廣告