สมมติว่าเรามีนิพจน์ postfix และเราต้องประเมินค่า นิพจน์ Postfix เรียกอีกอย่างว่า Reverse polish notation ที่นี่เราต้องใช้โครงสร้างข้อมูลสแต็กเพื่อแก้นิพจน์ postfix
ดังนั้นหากนิพจน์คือ “21+3*” คำตอบจะเป็น 9
ให้เราดูขั้นตอน -
- สำหรับแต่ละอักขระ ch ในนิพจน์ postfix ให้ทำ
- ถ้า ch เป็นโอเปอเรเตอร์ $\odot$ แล้ว
- a :=ป๊อปองค์ประกอบแรกจากสแต็ก
- b :=ป๊อปองค์ประกอบที่สองจากสแต็ก
- res :=b $\odot$ a
- ดัน res ลงใน stack
- มิฉะนั้น ถ้า ch เป็นตัวถูกดำเนินการ แล้ว
- เพิ่ม ch ลงในสแต็ก
- ถ้า ch เป็นโอเปอเรเตอร์ $\odot$ แล้ว
- ส่งคืนองค์ประกอบของ 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