Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

ประเมินนิพจน์ Postfix


สำหรับการแก้นิพจน์ทางคณิตศาสตร์ เราจำเป็นต้องมีแบบฟอร์มคำนำหน้าหรือคำต่อท้าย หลังจากแปลง infix เป็น postfix แล้ว เราต้องใช้อัลกอริธึมการประเมิน postfix เพื่อหาคำตอบที่ถูกต้อง

นอกจากนี้ เราต้องใช้โครงสร้างข้อมูลสแต็กเพื่อแก้ไขนิพจน์ postfix

จากนิพจน์ postfix เมื่อพบตัวถูกดำเนินการบางตัว ให้พุชพวกมันในสแต็ก เมื่อพบโอเปอเรเตอร์บางตัว รายการสองรายการจะถูกดึงออกจากสแต็กและดำเนินการตามลำดับที่ถูกต้อง หลังจากนั้น ผลลัพธ์ก็จะถูกผลักเข้าไปในสแตกเพื่อใช้ในอนาคต หลังจากกรอกนิพจน์ทั้งหมดแล้ว ผลลัพธ์สุดท้ายจะถูกเก็บไว้ในสแต็กด้านบนด้วย

อินพุตและเอาต์พุต

Input:
Postfix expression: 53+62/*35*+
Output:
The result is: 39

อัลกอริทึม

postfixEvaluation(postfix)

ป้อนข้อมูล: นิพจน์ 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