Stack | Set 4 (Evaluation of Postfix Expression)

The Postfix notation is used to represent algebraic expressions. The expressions written in postfix form are evaluated faster compared to infix notation as parenthesis are not required in postfix. We have discussed infix to postfix conversion. In this post, evaluation of postfix expressions is discussed.

Following is algorithm for evaluation postfix expressions.
1) Create a stack to store operands (or values).
2) Scan the given expression and do following for every scanned element.
…..a) If the element is a number, push it into the stack
…..b) If the element is a operator, pop operands for the operator from stack. Evaluate the operator and push the result back to the stack
3) When the expression is ended, the number in the stack is the final answer



Example:
Let the given expression be “2 3 1 * + 9 -“. We scan all elements one by one.
1) Scan ‘2’, it’s a number, so push it to stack. Stack contains ‘2’
2) Scan ‘3’, again a number, push it to stack, stack now contains ‘2 3’ (from bottom to top)
3) Scan ‘1’, again a number, push it to stack, stack now contains ‘2 3 1’
4) Scan ‘*’, it’s an operator, pop two operands from stack, apply the * operator on operands, we get 3*1 which results in 3. We push the result ‘3’ to stack. Stack now becomes ‘2 3’.
5) Scan ‘+’, it’s an operator, pop two operands from stack, apply the + operator on operands, we get 3 + 2 which results in 5. We push the result ‘5’ to stack. Stack now becomes ‘5’.
6) Scan ‘9’, it’s a number, we push it to the stack. Stack now becomes ‘5 9’.
7) Scan ‘-‘, it’s an operator, pop two operands from stack, apply the – operator on operands, we get 5 – 9 which results in -4. We push the result ‘-4’ to stack. Stack now becomes ‘-4’.
8) There are no more elements to scan, we return the top element from stack (which is the only element left in stack).

Below is the implementation of above algorithm.

C++

// C++ program to evaluate value of a postfix expression 
#include <iostream> 
#include <string.h> 
  
using namespace std;
  
// Stack type 
struct Stack 
    int top; 
    unsigned capacity; 
    int* array; 
}; 
  
// Stack Operations 
struct Stack* createStack( unsigned capacity ) 
    struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack)); 
  
    if (!stack) return NULL; 
  
    stack->top = -1; 
    stack->capacity = capacity; 
    stack->array = (int*) malloc(stack->capacity * sizeof(int)); 
  
    if (!stack->array) return NULL; 
  
    return stack; 
  
int isEmpty(struct Stack* stack) 
    return stack->top == -1 ; 
  
char peek(struct Stack* stack) 
    return stack->array[stack->top]; 
  
char pop(struct Stack* stack) 
    if (!isEmpty(stack)) 
        return stack->array[stack->top--] ; 
    return '$'
  
void push(struct Stack* stack, char op) 
    stack->array[++stack->top] = op; 
  
  
// The main function that returns value of a given postfix expression 
int evaluatePostfix(char* exp
    // Create a stack of capacity equal to expression size 
    struct Stack* stack = createStack(strlen(exp)); 
    int i; 
  
    // See if stack was created successfully 
    if (!stack) return -1; 
  
    // Scan all characters one by one 
    for (i = 0; exp[i]; ++i) 
    
        // If the scanned character is an operand (number here), 
        // push it to the stack. 
        if (isdigit(exp[i])) 
            push(stack, exp[i] - '0'); 
  
        // If the scanned character is an operator, pop two 
        // elements from stack apply the operator 
        else
        
            int val1 = pop(stack); 
            int val2 = pop(stack); 
            switch (exp[i]) 
            
            case '+': push(stack, val2 + val1); break
            case '-': push(stack, val2 - val1); break
            case '*': push(stack, val2 * val1); break
            case '/': push(stack, val2/val1); break
            
        
    
    return pop(stack); 
  
// Driver program to test above functions 
int main() 
    char exp[] = "231*+9-"
    cout<<"postfix evaluation: "<< evaluatePostfix(exp); 
    return 0; 

C

// C program to evaluate value of a postfix expression
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
  
// Stack type
struct Stack
{
    int top;
    unsigned capacity;
    int* array;
};
  
// Stack Operations
struct Stack* createStack( unsigned capacity )
{
    struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));
  
    if (!stack) return NULL;
  
    stack->top = -1;
    stack->capacity = capacity;
    stack->array = (int*) malloc(stack->capacity * sizeof(int));
  
    if (!stack->array) return NULL;
  
    return stack;
}
  
int isEmpty(struct Stack* stack)
{
    return stack->top == -1 ;
}
  
char peek(struct Stack* stack)
{
    return stack->array[stack->top];
}
  
char pop(struct Stack* stack)
{
    if (!isEmpty(stack))
        return stack->array[stack->top--] ;
    return '$';
}
  
void push(struct Stack* stack, char op)
{
    stack->array[++stack->top] = op;
}
  
  
// The main function that returns value of a given postfix expression
int evaluatePostfix(char* exp)
{
    // Create a stack of capacity equal to expression size
    struct Stack* stack = createStack(strlen(exp));
    int i;
  
    // See if stack was created successfully
    if (!stack) return -1;
  
    // Scan all characters one by one
    for (i = 0; exp[i]; ++i)
    {
        // If the scanned character is an operand (number here),
        // push it to the stack.
        if (isdigit(exp[i]))
            push(stack, exp[i] - '0');
  
        // If the scanned character is an operator, pop two
        // elements from stack apply the operator
        else
        {
            int val1 = pop(stack);
            int val2 = pop(stack);
            switch (exp[i])
            {
            case '+': push(stack, val2 + val1); break;
            case '-': push(stack, val2 - val1); break;
            case '*': push(stack, val2 * val1); break;
            case '/': push(stack, val2/val1); break;
            }
        }
    }
    return pop(stack);
}
  
// Driver program to test above functions
int main()
{
    char exp[] = "231*+9-";
    printf ("postfix evaluation: %d", evaluatePostfix(exp));
    return 0;
}

Java

// Java proram to evaluate value of a postfix expression
  
import java.util.Stack;
  
public class Test 
{
    // Method to evaluate value of a postfix expression
    static int evaluatePostfix(String exp)
    {
        //create a stack
        Stack<Integer> stack=new Stack<>();
          
        // Scan all characters one by one
        for(int i=0;i<exp.length();i++)
        {
            char c=exp.charAt(i);
              
            // If the scanned character is an operand (number here),
            // push it to the stack.
            if(Character.isDigit(c))
            stack.push(c - '0');
              
            //  If the scanned character is an operator, pop two
            // elements from stack apply the operator
            else
            {
                int val1 = stack.pop();
                int val2 = stack.pop();
                  
                switch(c)
                {
                    case '+':
                    stack.push(val2+val1);
                    break;
                      
                    case '-':
                    stack.push(val2- val1);
                    break;
                      
                    case '/':
                    stack.push(val2/val1);
                    break;
                      
                    case '*':
                    stack.push(val2*val1);
                    break;
              }
            }
        }
        return stack.pop();    
    }
      
    // Driver program to test above functions
    public static void main(String[] args) 
    {
        String exp="231*+9-";
        System.out.println("postfix evaluation: "+evaluatePostfix(exp));
    }
}
// Contributed by Sumit Ghosh

Python

# Python program to evaluate value of a postfix expression
  
# Class to convert the expression
class Evaluate:
      
    # Constructor to initialize the class variables
    def __init__(self, capacity):
        self.top = -1
        self.capacity = capacity
        # This array is used a stack 
        self.array = []
      
    # check if the stack is empty
    def isEmpty(self):
        return True if self.top == -1 else False
      
    # Return the value of the top of the stack
    def peek(self):
        return self.array[-1]
      
    # Pop the element from the stack
    def pop(self):
        if not self.isEmpty():
            self.top -= 1
            return self.array.pop()
        else:
            return "$"
      
    # Push the element to the stack
    def push(self, op):
        self.top += 1
        self.array.append(op) 
  
  
    # The main function that converts given infix expression
    # to postfix expression
    def evaluatePostfix(self, exp):
          
        # Iterate over the expression for conversion
        for i in exp:
              
            # If the scanned character is an operand
            # (number here) push it to the stack
            if i.isdigit():
                self.push(i)
  
            # If the scanned character is an operator,
            # pop two elements from stack and apply it.
            else:
                val1 = self.pop()
                val2 = self.pop()
                self.push(str(eval(val2 + i + val1)))
  
        return int(self.pop())
                  
  
              
# Driver program to test above function
exp = "231*+9-"
obj = Evaluate(len(exp))
print "postfix evaluation: %d"%(obj.evaluatePostfix(exp))
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)

C#

// C# proram to evaluate value of a postfix expression
using System;
using System.Collections;
  
namespace GFG
{
    class Geek
    {
        //Main() method
        static void Main()
        {
            Geek e = new Geek();
            e.v = ("231*+9-");
            e.expression();
            Console.WriteLine("postfix evaluation: " + e.answer);
            Console.Read();
        }
  
        public string v;
        //'v' is variable to store the string value
  
        public string answer;
        Stack i = new Stack();
        //'Stack()' is inbuilt function for namespace 'System.Collections'
  
        public void expression()
        //evaluation method
        {
            int a, b, ans;
            for (int j = 0; j < v.Length; j++)
            //'v.Length' means length of the string
            {
                String c = v.Substring(j, 1);
                if (c.Equals("*"))
                {
                    String sa = (String)i.Pop();
                    String sb = (String)i.Pop();
                    a = Convert.ToInt32(sb);
                    b = Convert.ToInt32(sa);
                    ans = a * b;
                    i.Push(ans.ToString());
  
                }
                else if (c.Equals("/"))
                {
                    String sa = (String)i.Pop();
                    String sb = (String)i.Pop();
                    a = Convert.ToInt32(sb);
                    b = Convert.ToInt32(sa);
                    ans = a / b;
                    i.Push(ans.ToString());
                }
                else if (c.Equals("+"))
                {
                    String sa = (String)i.Pop();
                    String sb = (String)i.Pop();
                    a = Convert.ToInt32(sb);
                    b = Convert.ToInt32(sa);
                    ans = a + b;
                    i.Push(ans.ToString());
  
                }
                else if (c.Equals("-"))
                {
                    String sa = (String)i.Pop();
                    String sb = (String)i.Pop();
                    a = Convert.ToInt32(sb);
                    b = Convert.ToInt32(sa);
                    ans = a - b;
                    i.Push(ans.ToString());
  
                }
                else
                {
                    i.Push(v.Substring(j, 1));
                }
            }
            answer = (String)i.Pop();
        }
    }
}


Output:

postfix evaluation: -4

Time complexity of evaluation algorithm is O(n) where n is number of characters in input expression.

There are following limitations of above implementation.
1) It supports only 4 binary operators ‘+’, ‘*’, ‘-‘ and ‘/’. It can be extended for more operators by adding more switch cases.
2) The allowed operands are only single digit operands. The program can be extended for multiple digits by adding a separator like space between all elements (operators and operands) of given expression.



Below given is the extended program which allows operands having multiple digits.

C

// C program to evaluate value of a postfix
// expression having multiple digit operands
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
  
// Stack type
struct Stack
{
    int top;
    unsigned capacity;
    int* array;
};
  
// Stack Operations
struct Stack* createStack( unsigned capacity )
{
    struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));
  
    if (!stack) return NULL;
  
    stack->top = -1;
    stack->capacity = capacity;
    stack->array = (int*) malloc(stack->capacity * sizeof(int));
  
    if (!stack->array) return NULL;
  
    return stack;
}
  
int isEmpty(struct Stack* stack)
{
    return stack->top == -1 ;
}
  
int peek(struct Stack* stack)
{
    return stack->array[stack->top];
}
  
int pop(struct Stack* stack)
{
    if (!isEmpty(stack))
        return stack->array[stack->top--] ;
    return '$';
}
  
void push(struct Stack* stack,int op)
{
    stack->array[++stack->top] = op;
}
  
  
// The main function that returns value 
// of a given postfix expression
int evaluatePostfix(char* exp)
{
    // Create a stack of capacity equal to expression size
    struct Stack* stack = createStack(strlen(exp));
    int i;
  
    // See if stack was created successfully
    if (!stack) return -1;
  
    // Scan all characters one by one
    for (i = 0; exp[i]; ++i)
    {
        //if the character is blank space then continue
        if(exp[i]==' ')continue;
          
        // If the scanned character is an 
        // operand (number here),extract the full number
        // Push it to the stack.
        else if (isdigit(exp[i]))
        {
            int num=0;
              
            //extract full number
            while(isdigit(exp[i])) 
            {
            num=num*10 + (int)(exp[i]-'0');
                i++;
            }
            i--;
              
            //push the element in the stack
            push(stack,num);
        }
          
        // If the scanned character is an operator, pop two
        // elements from stack apply the operator
        else
        {
            int val1 = pop(stack);
            int val2 = pop(stack);
              
            switch (exp[i])
            {
            case '+': push(stack, val2 + val1); break;
            case '-': push(stack, val2 - val1); break;
            case '*': push(stack, val2 * val1); break;
            case '/': push(stack, val2/val1); break;
              
            }
        }
    }
    return pop(stack);
}
  
// Driver program to test above functions
int main()
{
    char exp[] = "100 200 + 2 / 5 * 7 +";
    printf ("%d", evaluatePostfix(exp));
    return 0;
}
  
// This code is contributed by Arnab Kundu

Java

// Java proram to evaluate value of a postfix 
// expression having multiple digit operands
import java.util.Stack;
  
class Test1
{
    // Method to evaluate value of a postfix expression
    static int evaluatePostfix(String exp)
    {
        //create a stack
        Stack<Integer> stack = new Stack<>();
          
        // Scan all characters one by one
        for(int i = 0; i < exp.length(); i++)
        {
            char c = exp.charAt(i);
              
            if(c == ' ')
            continue;
              
            // If the scanned character is an operand 
            // (number here),extract the number
            // Push it to the stack.
            else if(Character.isDigit(c))
            {
                int n = 0;
                  
                //extract the characters and store it in num
                while(Character.isDigit(c))
                {
                    n = n*10 + (int)(c-'0');
                    i++;
                    c = exp.charAt(i);
                }
                i--;
  
                //push the number in stack
                stack.push(n);
            }
              
            // If the scanned character is an operator, pop two
            // elements from stack apply the operator
            else
            {
                int val1 = stack.pop();
                int val2 = stack.pop();
                  
                switch(c)
                {
                    case '+':
                    stack.push(val2+val1);
                    break;
                      
                    case '-':
                    stack.push(val2- val1);
                    break;
                      
                    case '/':
                    stack.push(val2/val1);
                    break;
                      
                    case '*':
                    stack.push(val2*val1);
                    break;
            }
            }
        }
        return stack.pop(); 
    }
      
    // Driver program to test above functions
    public static void main(String[] args) 
    {
        String exp = "100 200 + 2 / 5 * 7 +";
        System.out.println(evaluatePostfix(exp));
    }
}
  
// This code is contributed by Arnab Kundu


Output :

757

 

 

References:
http://www.cs.nthu.edu.tw/~wkhon/ds/ds10/tutorial/tutorial2.pdf

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above



My Personal Notes arrow_drop_up


Improved By : andrew1234, SoumikMondal

Article Tags :
Practice Tags :



Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.