With a given Prefix Expression, we will show you how to evaluate a prefix expression using stack.
In this algorithm, we will use stack to store operands. The step are as follows:
Algorithm to evaluate Prefix Expression:
In this algorithm, we will use stack to store operands. The step are as follows:
- Get the Prefix Expression String
- While the end of Pretfix string read from right to left
- If the current character is operand
- Push it into Stack
- End If
- If the current character is operator
- Pop stack for first_operand
- Pop stack for second_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 Prefix Expression
double evaluate_prefix_exp(char *prestr){
STACK stk;
int i = strlen(prestr);
double op1, op2;
stk.top = -1;
while(--i != -1){
if(prestr[i] == ' '){ //escape space
continue;
}
if(isdig(prestr[i])){
push( &stk, (double)(prestr[i]-'0')/*char to int*/ );
}
else{
op1 = pop(&stk); // first poped number will be used as 1st operand
op2 = pop(&stk);
push( &stk, operation( prestr[i], op1, op2 ) );
}
}
return pop( &stk );
}
Program to evaluate Prefix Expression:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define STACK_SIZE 50
typedef struct{
int top;
double stack[STACK_SIZE];
} STACK;
double evaluate_prefix_exp(char *);
void push(STACK *, double );
double pop(STACK *);
int isdig(char);
double operation(char, double, double);
int main(){
double answer;
char *prefix_str = "++1*234"; //108
answer = evaluate_prefix_exp(prefix_str);
printf("The answer of prefix expression \"%s\" = %.2f", prefix_str, answer);
return 0;
}
double evaluate_prefix_exp(char *prestr){
STACK stk;
int i = strlen(prestr);
double op1, op2;
stk.top = -1;
while(--i != -1){
if(prestr[i] == ' '){ //escape space
continue;
}
if(isdig(prestr[i])){
push( &stk, (double)(prestr[i]-'0')/*char to int*/ );
}
else{
op1 = pop(&stk); // first poped number will be used as 1st operand
op2 = pop(&stk);
push( &stk, operation( prestr[i], op1, op2 ) );
}
}
return pop( &stk );
}
int isdig(char c){
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 prefix expression "++1*234" = 11.00
Comments
Post a Comment