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

โปรแกรมสำหรับประเมิน Postfix Notation ใน C++


สมมติว่าเรามีนิพจน์ postfix และเราต้องประเมินค่า นิพจน์ Postfix เรียกอีกอย่างว่า Reverse polish notation ที่นี่เราต้องใช้โครงสร้างข้อมูลสแต็กเพื่อแก้นิพจน์ postfix

ดังนั้นหากนิพจน์คือ “21+3*” คำตอบจะเป็น 9

ให้เราดูขั้นตอน -

  • สำหรับแต่ละอักขระ ch ในนิพจน์ postfix ให้ทำ
    • ถ้า ch เป็นโอเปอเรเตอร์ $\odot$ แล้ว
      • a :=ป๊อปองค์ประกอบแรกจากสแต็ก
      • b :=ป๊อปองค์ประกอบที่สองจากสแต็ก
      • res :=b $\odot$ a
      • ดัน res ลงใน stack
    • มิฉะนั้น ถ้า ch เป็นตัวถูกดำเนินการ แล้ว
      • เพิ่ม ch ลงในสแต็ก
  • ส่งคืนองค์ประกอบของ stack top

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#includeใช้เนมสเปซ std;float scanNum(ถ่าน ch){ ค่า int; ค่า =ch; return float(value-'0');//return float from character}int isOperator(char ch){ if(ch =='+'|| ch =='-'|| 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;//ไม่ใช่ตัวดำเนินการ } int isOperand(char ch){ if(ch>='0' &&ch <='9') return 1;//character เป็นตัวถูกดำเนินการ return -1;// ไม่ใช่ตัวถูกดำเนินการ } float operation (int a, int b, char op) { // ดำเนินการถ้า (op =='+ ') คืนค่า b+a; อื่น if(op =='-') ส่งคืน b-a; อื่น if(op =='*') ส่งคืน b*a; อื่น if(op =='/') คืนค่า b/a; อื่น if(op =='^') return pow(b,a); // ค้นหา b^a อื่นส่งคืน INT_MIN; // คืนค่าอินฟินิตี้เชิงลบ}float postfixEval (สตริง postfix) { int a, b; กอง  stk; string::iterator มัน; for(it=postfix.begin(); it!=postfix.end(); it++){ //อ่านองค์ประกอบและดำเนินการประเมิน postfix if(isOperator(*it) !=-1){ a =stk.top(); stk.pop(); b =stk.top(); stk.pop(); stk.push(การดำเนินการ(a, b, *มัน)); }อื่น if(isOperand(*it)> 0){ stk.push(scanNum(*it)); } } return stk.top();}main(){ string post ="21+3*"; ศาล < 

อินพุต

"21+3*"

ผลลัพธ์

9