ในปัญหานี้ เราได้รับนิพจน์คำนำหน้า งานของเราคือพิมพ์การแปลง infix ของนิพจน์ที่กำหนด
นิพจน์คำนำหน้าคือนิพจน์ที่มีตัวดำเนินการอยู่หน้าตัวถูกดำเนินการ
ตัวอย่าง:+AB.
นิพจน์ Infix คือนิพจน์ที่มีตัวดำเนินการระหว่างตัวถูกดำเนินการ
ตัวอย่าง:A+B
นิพจน์ Infix เป็นข้อมูลเพื่อความเข้าใจของมนุษย์ แต่คอมพิวเตอร์ทำการคำนวณด้วยนิพจน์คำนำหน้าหรือคำนำหน้า (โดยทั่วไปคือ postfix)
มาดูตัวอย่างทำความเข้าใจปัญหากัน
Input: prefix : /+LM/NX Output: infix : (L+M) / (N/X)
เพื่อแก้ปัญหานี้ เราจะใช้โครงสร้างข้อมูลสแต็ก เราจะสำรวจนิพจน์คำนำหน้าในลำดับที่กลับกันของนิพจน์ และสำหรับแต่ละองค์ประกอบของนิพจน์ ให้ตรวจสอบกรณีเหล่านี้
หากองค์ประกอบเป็นตัวถูกดำเนินการ -> ผลัก (องค์ประกอบ) ในสแต็ก
หากองค์ประกอบเป็นตัวดำเนินการ -> 2Xpop(topofstack) และกดตามลำดับเป็นสตริง =ตัวถูกดำเนินการ - ตัวดำเนินการ - ตัวถูกดำเนินการ
สุดท้าย หลังจากการข้ามผ่าน ส่วนบนของสแต็กจะมีสตริงซึ่งเป็นการแปลง infix พิมพ์ออกมา
โปรแกรมแสดงการใช้งานโซลูชันของเรา
ตัวอย่าง
#include <iostream> #include <stack> using namespace std; bool isOperator(char element) { switch (element) { case '+': case '-': case '/': case '*': return true; } return false; } string convertToInfix(string prefix) { stack<string> expression; int length = prefix.size(); for (int i = length - 1; i >= 0; i--) { if (isOperator(prefix[i])) { string op1 = expression.top(); expression.pop(); string op2 = expression.top(); expression.pop(); string temp = "{"+op1+prefix[i]+op2+"}"; expression.push(temp); } else { expression.push(string(1, prefix[i])); } } return expression.top(); } int main() { string prefix = "*-AB/+CD*XY"; cout<<"Prefix expression : "<<prefix<<endl; cout<<"Infix expression : " <<convertToInfix(prefix); return 0; }
ผลลัพธ์
Prefix expression : *-AB/+CD*XY Infix expression : {{A-B}*{{C+D}/{X*Y}}}