ในการแก้นิพจน์ทางคณิตศาสตร์ เราต้องใช้แบบฟอร์มคำนำหน้าหรือคำแก้หลัง หลังจากแปลง infix เป็น postfix แล้ว เราต้องใช้อัลกอริธึมการประเมิน postfix เพื่อหาคำตอบที่ถูกต้อง
นอกจากนี้ เราต้องใช้โครงสร้างข้อมูลสแต็กเพื่อแก้ไขนิพจน์ postfix
จากนิพจน์ postfix เมื่อพบตัวถูกดำเนินการบางตัว ให้พุชพวกมันในสแต็ก เมื่อพบโอเปอเรเตอร์บางตัว รายการสองรายการจะถูกดึงออกจากสแต็ก จากนั้นดำเนินการตามลำดับที่ถูกต้อง หลังจากนั้นผลลัพธ์ก็จะถูกผลักเข้าไปในสแตกเพื่อใช้ในอนาคต หลังจากกรอกนิพจน์ทั้งหมดแล้ว ผลลัพธ์สุดท้ายจะถูกเก็บไว้ในสแต็กด้านบนด้วย
Input: Postfix expression: 53+62/*35*+ Output: The result is: 39
อัลกอริทึม
postfixEvaluation(แก้ไขภายหลัง)
ป้อนข้อมูล :นิพจน์ Postfix เพื่อประเมิน
ผลผลิต :ตอบหลังจากประเมินแบบฟอร์ม postfix
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