While we use infix expressions in our day to day lives. Computers have trouble understanding this format because they need to keep in mind rules of operator precedence and also brackets. Prefix and Postfix expressions are easier for a computer to understand and evaluate.
Given two operands
and
and an operator
, the infix notation implies that O will be placed in between a and b i.e
. When the operator is placed after both operands i.e
, it is called postfix notation. And when the operator is placed before the operands i.e
, the expression in prefix notation.
Given any infix expression we can obtain the equivalent prefix and postfix format.
Examples:
Input : A * B + C / D Output : + * A B/ C D Input : (A - B/C) * (A/K-L) Output : *-A/BC-/AKL
To convert an infix to postfix expression refer to this article Stack | Set 2 (Infix to Postfix). We use the same to convert Infix to Prefix.
- Step 1: Reverse the infix expression i.e A+B*C will become C*B+A. Note while reversing each ‘(‘ will become ‘)’ and each ‘)’ becomes ‘(‘.
- Step 2: Obtain the postfix expression of the modified expression i.e CB*A+.
- Step 3: Reverse the postfix expression. Hence in our example prefix is +A*BC.
Below is the C++ implementation of the algorithm.
// CPP program to convert infix to prefix #include <bits/stdc++.h> using namespace std; bool isOperator(char c) { return (!isalpha(c) && !isdigit(c)); } int getPriority(char C) { if (C == '-' || C == '+') return 1; else if (C == '*' || C == '/') return 2; else if (C == '^') return 3; return 0; } string infixToPostfix(string infix) { infix = '(' + infix + ')'; int l = infix.size(); stack<char> char_stack; string output; for (int i = 0; i < l; i++) { // If the scanned character is an // operand, add it to output. if (isalpha(infix[i]) || isdigit(infix[i])) output += infix[i]; // If the scanned character is an // ‘(‘, push it to the stack. else if (infix[i] == '(') char_stack.push('('); // If the scanned character is an // ‘)’, pop and output from the stack // until an ‘(‘ is encountered. else if (infix[i] == ')') { while (char_stack.top() != '(') { output += char_stack.top(); char_stack.pop(); } // Remove '(' from the stack char_stack.pop(); } // Operator found else { if (isOperator(char_stack.top())) { while (getPriority(infix[i]) <= getPriority(char_stack.top())) { output += char_stack.top(); char_stack.pop(); } // Push current Operator on stack char_stack.push(infix[i]); } } } return output; } string infixToPrefix(string infix) { /* Reverse String * Replace ( with ) and vice versa * Get Postfix * Reverse Postfix * */ int l = infix.size(); // Reverse infix reverse(infix.begin(), infix.end()); // Replace ( with ) and vice versa for (int i = 0; i < l; i++) { if (infix[i] == '(') { infix[i] = ')'; i++; } else if (infix[i] == ')') { infix[i] = '('; i++; } } string prefix = infixToPostfix(infix); // Reverse postfix reverse(prefix.begin(), prefix.end()); return prefix; } // Driver code int main() { string s = ("(a-b/c)*(a/k-l)"); cout << infixToPrefix(s) << std::endl; return 0; } |
Output:
*-a/bc-/akl
Complexity:
Stack operations like push() and pop() are performed in constant time. Since we scan all the characters in the expression once the complexity is linear in time i.e
.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
Recommended Posts:
- Program to convert Infix notation to Expression Tree
- Infix to Prefix conversion using two stacks
- Prefix to Infix Conversion
- Print all words matching a pattern in CamelCase Notation Dictonary
- Postfix to Infix
- Infix to Postfix using different Precedence Values for In-Stack and Out-Stack
- Stack | Set 2 (Infix to Postfix)
- Longest Common Prefix using Word by Word Matching
- Longest Common Prefix using Character by Character Matching
- Longest Common Prefix using Divide and Conquer Algorithm
- Longest Common Prefix using Binary Search
- Longest Common Prefix using Trie
- Longest Common Prefix using Sorting
- Find shortest unique prefix for every word in a given list | Set 2 (Using Sorting)
- Longest palindromic string formed by concatenation of prefix and suffix of a string
- Prefix matching in Python using pytrie module
- Find minimum shift for longest common prefix
- Evaluation of Prefix Expressions
- Longest Common Prefix using Linked List
- Longest Common Prefix Matching | Set-6
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.
