इस समस्या में, हमें एक अभिव्यक्ति पोस्टफिक्स रूप में दी गई है और हमारा कार्य इसका इनफिक्स रूप प्रिंट करना है।
इनफिक्स अभिव्यक्ति वह अभिव्यक्ति है जिसमें ऑपरेटर ऑपरेंड के बीच में होता है, जैसे ऑपरेंड ऑपरेटर ऑपरेंड।
पोस्टफिक्स अभिव्यक्ति वह अभिव्यक्ति है जिसमें ऑपरेटर ऑपरेंड के बाद होता है, जैसे ऑपरेंड ऑपरेटर।
पोस्टफिक्स अभिव्यक्तियों की गणना सिस्टम द्वारा आसानी से की जाती है लेकिन ये मानव-पठनीय नहीं होतीं। इसलिए इस रूपांतरण की आवश्यकता होती है। आमतौर पर अंतिम उपयोगकर्ता द्वारा पढ़ना और संपादन इनफिक्स नोटेशन में किया जाता है क्योंकि वे पैरेंथेसिस से अलग होते हैं इसलिए मनुष्यों के लिए आसानी से समझने योग्य होते हैं।
आइए एक उदाहरण से समझते हैं:
इनपुट - xyz/*
आउटपुट - (x * (y/z))
इस समस्या को हल करने के लिए, हम स्टैक डेटा संरचना का उपयोग करेंगे। और पोस्टफिक्स अभिव्यक्ति को एक-एक करके पार करेंगे और निम्नलिखित मामलों की जांच करेंगे:
केस 1 - यदि ऑपरेंड मिलता है, तो इसे स्टैक में पुश करें।
केस 2 - यदि ऑपरेटर मिलता है, तो दो ऑपरेंड पॉप करें, तीनों का एक इनफिक्स अभिव्यक्ति बनाएं और अभिव्यक्ति को ऑपरेंड के रूप में पुश करें।
अंत में जब स्टैक में केवल एक तत्व बचता है और पार करना पूरा हो जाता है, तो स्टैक के शीर्ष को पॉप करें, यह इनफिक्स रूपांतरण है।
उदाहरण
हमारे समाधान के कार्यान्वयन को दर्शाने वाला प्रोग्राम।
#include <bits/stdc++.h> using namespace std; bool isOperand(char x) { return (x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z'); } string infixConversion(string postfix) { stack<string> infix; for (int i=0; postfix[i]!='\0'; i++) { if (isOperand(postfix[i])) { string op(1, postfix[i]); infix.push(op); } else { string op1 = infix.top(); infix.pop(); string op2 = infix.top(); infix.pop(); infix.push("{"+op2+postfix[i]+op1 +"}"); } } return infix.top(); } int main() { string postfix = "xyae+/%"; cout<<"पोस्टफिक्स अभिव्यक्ति '"<<postfix<<"' का इनफिक्स रूपांतरण है: "; cout<<infixConversion(postfix); return 0; }आउटपुट
पोस्टफिक्स अभिव्यक्ति 'xyae+/%' का इनफिक्स रूपांतरण है: {x%{y/{a+e}}}