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

คำนำหน้าเพื่อการแปลง Postfix ใน C ++


ในปัญหานี้ เราได้รับนิพจน์คำนำหน้า งานของเราคือพิมพ์การแปลงคำต่อท้ายของนิพจน์ที่กำหนด

คำนำหน้า expression คือนิพจน์ที่มีตัวดำเนินการก่อนตัวถูกดำเนินการ

ตัวอย่าง:+AB.

แก้ไขภายหลัง นิพจน์คือนิพจน์ที่มีตัวดำเนินการหลังตัวถูกดำเนินการในนิพจน์

ตัวอย่าง:AB/

การแปลงคำนำหน้าเป็นคำนำหน้าไม่ควรเกี่ยวข้องกับการแปลงคำนำหน้าเป็นคำนำหน้า

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

Input: /+XY+NM
Output: XY+NM+/
Explanation: infix -> (X+Y)/(N+M)

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

กรณี:หากสัญลักษณ์เป็นตัวถูกดำเนินการ -> ผลัก (องค์ประกอบ) ในสแต็ก

กรณี:ถ้าสัญลักษณ์เป็นตัวดำเนินการ -> 2*pop(องค์ประกอบ) จากสแต็ก แล้วกดลำดับของตัวถูกดำเนินการ - ตัวถูกดำเนินการ - โอเปอเรเตอร์

โปรแกรมแสดงการใช้งานอัลกอริทึมของเรา

ตัวอย่าง

#include <iostream>
#include <stack>
using namespace std;
bool isOperator(char x) {
   switch (x) {
      case '+':
      case '-':
      case '/':
      case '*':
      return true;
   }
   return false;
}
string convertToPostfix(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 + op2 + prefix[i];
         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<<"Postfix expression : "<<convertToPostfix(prefix);
   return 0;
}

ผลลัพธ์

Prefix expression : *-AB/+CD*XY
Postfix expression : AB-CD+XY*/*