With a given Postfix Expression, we will show you how to evaluate a postfix expression using stack.
Algorithm to evaluate postfix expression:
In this algorithm, we will use stack to store operands. The step are as follows:- Get the Postfix Expression String
- While the end of Postfix Expression string
- If the current character is operand
- Push it into Stack
- End If
- If the current character is operator
- Pop stack for second_operand
- Pop stack for first_operand
- Evaluate the expression (first_operand)(operator)(second_operand) and push the result into stack
- End If
- If the current character is operand
- End While
- Pop stack for result and return it
Function to Evaluate Postfix Expression:
double evaluate_postfix_exp(char *poststr){
STACK stk; //stack for pushing operands
int i = -1;
double op1, op2;
stk.top = -1; //top of stack
while(poststr[++i]){
if(poststr[i] == ' '){ //escape space
continue;
}
if(isdig(poststr[i])){
push( &stk, (double)(poststr[i]-'0')/*char to int*/ );
}
else{
op2 = pop(&stk); // first poped number will be used as 2nd operand
op1 = pop(&stk);
push( &stk, operation( poststr[i], op1, op2 ) );
}
}
return pop( &stk ); //answer of evaluation
}
Program to Evaluate Postfix Expression:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define STACK_SIZE 50
typedef struct{
int top;
double stack[STACK_SIZE];
} STACK;
double evaluate_postfix_exp(char *);
void push(STACK *, double );
double pop(STACK *);
int isdig(char);
double operation(char, double, double);
int main(){
double answer;
char *postfix_str = "1 2 + 3 ^ 4 *"; //108
answer = evaluate_postfix_exp(postfix_str);
printf("The answer of postfix expression \"%s\" = %.2f", postfix_str, answer);
return 0;
}
double evaluate_postfix_exp(char *poststr){
STACK stk; //stack for pushing operands
int i = -1;
double op1, op2;
stk.top = -1; //top of stack
while(poststr[++i]){
if(poststr[i] == ' '){ //escape space
continue;
}
if(isdig(poststr[i])){
push( &stk, (double)(poststr[i]-'0')/*char to int*/ );
}
else{
op2 = pop(&stk); // first poped number will be used as 2nd operand
op1 = pop(&stk);
push( &stk, operation( poststr[i], op1, op2 ) );
}
}
return pop( &stk ); //answer of evaluation
}
int isdig(char c){ //whether the c is number
return ( (c >= '0') && (c <= '9') );
}
void push(STACK *s, double num){
if(s->top == STACK_SIZE-1){
printf("Stack Overflow\n");
}
else{
s->stack[++s->top] = num;
}
}
double pop(STACK *s){
if(s->top == -1){
printf("Stack Underflow\n");
exit(2);
}
else{
return s->stack[s->top--];
}
}
double operation(char c, double op1, double op2){
switch(c){
case '+' : return op1+op2;
case '-' : return op1-op2;
case '*' : return op1*op2;
case '/' : return op1/op2;
case '^' : return pow(op1, op2);
default : printf("Invalid operator %c used", c);
exit(1);
}
}
The answer of postfix expression "1 2 + 3 ^ 4 *" = 108.00
Comments
Post a Comment