The problem is that you are given a post fix expression and you need to convert it to a fully parenthesize infix expression.
Exmple:
- Input: ab+
- Output: (a+b)
The approach used in this program is to print the parenthesis durin infix traversal of the expression tree built from the postfix expression.
#include <iostream> #include <stack> using namespace std; typedef struct Node { char data; Node *lChild, *rChild; }Node; class ExpressionTree { private: Node *root; public: ExpressionTree() { root = NULL; } ExpressionTree(char[]); Node* getRoot() { return root; } Node* createNode(char , Node*, Node*); friend bool isOperator(char); friend void inOrder(); }; bool isOperator(char opp) { switch(opp) { case '+': case '*': case '/': case '^': case '-': return true; default: return false; } } Node* ExpressionTree::createNode(char ch, Node *l, Node *r) { Node *tmp = new Node(); tmp->data = ch; tmp->lChild = l; tmp->rChild = r; return tmp; } ExpressionTree::ExpressionTree(char arr[]) { stack<Node*> s; Node *ptr, *l, *r; int i = 0; while(arr[i]) { if(isOperator(arr[i])) { l = s.top(); s.pop(); r = s.top(); s.pop(); ptr = createNode(arr[i], r , l); } else { ptr = createNode(arr[i], NULL, NULL); } s.push(ptr); i++; } root = s.top(); } void inOrder(Node* T) { if(T != NULL) { if(isOperator(T->data)) cout << "("; inOrder(T->lChild); cout << T->data; inOrder(T->rChild); if(isOperator(T->data)) cout << ")"; } } int main() { char exp[50]; cout << "Enter A Postfix Expression:" << ends; cin >> exp; ExpressionTree t(exp); cout << "Given Postfix Expression:" << ends; cout << exp << endl; cout << "In-order Form: " << ends; inOrder(t.getRoot()); return 0; }
Enter A Postfix Expression: ab+c* Given Postfix Expression: ab+c* In-order Form: ((a+b)*c) -------------------------------- Process exited after 6.555 seconds with return value 0 Press any key to continue . . .