In the Evaluation of the postfix expression problem, we have given a string s containing a postfix expression. Evaluate the given expression.
Table of Contents
Example
Input : s = “231*+9-”
Output : -4
Input : s = “100 200 + 2 / 5 * 7 +”
Output : 757
For Operands Having Single Digits
Algorithm
- Initialize a string s containing postfix expression.
- Create a stack of the same size as that of the string.
- If there is no stack return -1. Else traverse through the string and check if the current character is a digit, push the digit in the stack.
- Else pop the top two elements in the stack. Apply the current character/operator on them and push their result in the stack.
- Return the top of the stack.
C++ Program for Evaluation of Postfix Expression
#include <iostream> #include <string.h> using namespace std; struct Stack{ int top; unsigned capacity; int* array; }; 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; } int evaluatePostfix(char* exp){ struct Stack* stack = createStack(strlen(exp)); int i; if(!stack){ return -1; } for(i = 0; exp[i]; ++i){ if(isdigit(exp[i])){ push(stack, exp[i] - '0'); } 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); } int main(){ char s[] = "231*+9-"; cout<<evaluatePostfix(s); return 0; }
-4
Java Program for Evaluation of Postfix Expression
import java.util.Stack; class Postfix{ static int evaluatePostfix(String exp){ Stack<Integer> stack=new Stack<>(); for(int i=0;i<exp.length();i++){ char c=exp.charAt(i); if(Character.isDigit(c)){ stack.push(c - '0'); } 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(); } public static void main(String[] args){ String s = "231*+9-"; System.out.println(evaluatePostfix(s)); } }
-4
Complexity Analysis
Time Complexity: O(n) where n is the size of the given string/expression.
Auxiliary Space: O(n) because we used the stack space for n characters.
For Operands Having Multiple Digits
Algorithm
- Initialize a string s containing postfix expression.
- Create a stack of the same size as that of the string.
- If there is no stack return -1. Else traverse through the string and check if the current character is white space continues the loop.
- If the current character is a digit, check if it’s a number read the full number else read the digit and push the digit in the stack.
- Else pop the top two elements in the stack. Apply the current character/operator on them and push their result in the stack.
- Return the top of the stack.
C++ Program for Evaluation of Postfix Expression
#include <iostream> #include <string.h> using namespace std; class Stack{ public: int top; unsigned capacity; int* array; }; Stack* createStack( unsigned capacity ){ Stack* stack = new Stack(); if(!stack){ return NULL; } stack->top = -1; stack->capacity = capacity; stack->array = new int[(stack->capacity * sizeof(int))]; if(!stack->array){ return NULL; } return stack; } int isEmpty(Stack* stack){ return stack->top == -1 ; } int peek(Stack* stack){ return stack->array[stack->top]; } int pop(Stack* stack){ if(!isEmpty(stack)){ return stack->array[stack->top--]; } return '$'; } void push(Stack* stack,int op){ stack->array[++stack->top] = op; } int evaluatePostfix(char* exp){ Stack* stack = createStack(strlen(exp)); int i; if(!stack){ return -1; } for(i = 0; exp[i]; ++i){ if(exp[i] == ' '){ continue; } else if(isdigit(exp[i])){ int num=0; while(isdigit(exp[i])){ num = num * 10 + (int)(exp[i] - '0'); i++; } i--; push(stack,num); } 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); } int main(){ char s[] = "100 200 + 2 / 5 * 7 +"; cout<<evaluatePostfix(s); return 0; }
757
Java Program for Evaluation of Postfix Expression
import java.util.Stack; class Postfix{ static int evaluatePostfix(String exp){ Stack<Integer> stack = new Stack<>(); for(int i = 0; i < exp.length(); i++){ char c = exp.charAt(i); if(c == ' '){ continue; } else if(Character.isDigit(c)){ int n = 0; while(Character.isDigit(c)){ n = n*10 + (int)(c-'0'); i++; c = exp.charAt(i); } i--; stack.push(n); } 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(); } public static void main(String[] args){ String s = "100 200 + 2 / 5 * 7 +"; System.out.println(evaluatePostfix(s)); } }
757
Complexity Analysis
Time Complexity: O(n) where n is the size of the given string/expression.
Auxiliary Space: O(n) because we used the stack space for n characters.