Best C Programming code for Postfix expression evaluation (January,2021)

//Infix to Postfix conversion along with Postfix evaluation

#include<stdio.h>
#define max 50
typedef struct stack
{
char ar[max];
int top;
}st;

typedef struct stack1
{
 float res[max];
 int top;
}st1;

void push(st *,char);
void push1(st1 *,float);
char pop(st *);
float pop1(st1 *);
char peek(st);
int isfull(st);
int isempty(st);
float pfixeval(char []);
void intopost(char [],char []);
int getpriority(char);
int main()
{
char expr[max],res[max];
float p;
printf("\nEnter the expression (in single digits only) to be evaluated in Infix form and rest is our responsibility : ");
gets(expr);

intopost(expr,res);
printf("\nThe postfix expression is : ");
puts(res);

p=pfixeval(res);
printf("\nEvaluated result is : %f",p);

}

void intopost(char expr[],char res[])
{
st s;
char ch;
int i,j;
s.top=-1;
for(i=0,j=0;expr[i]!='\0';i++)
{
if(expr[i]==' ')
continue;
else if(expr[i]=='(' || expr[i]=='{' || expr[i]=='[')
push(&s,expr[i]);
else if((expr[i]>=48 && expr[i]<=57) || (expr[i]>=65 && expr[i]<=90) || (expr[i]>=97 && expr[i]<=122))
res[j++]=expr[i];
else if(expr[i]=='+' || expr[i]=='-' || expr[i]=='*' || expr[i]=='/')
{
while(!isempty(s) && getpriority(expr[i])<=getpriority(peek(s)) && peek(s)!='(')
{
res[j++]=pop(&s);
}

push(&s,expr[i]);
}
else if(expr[i]==')' || expr[i]=='}' || expr[i]==']')
{
 while(!isempty(s) && (ch=pop(&s))!='(')
 {
  res[j++]=ch;
 }
}
else
{
printf("Expression not ok");
break;
}
}
if(!isempty(s))
{
while(!isempty(s) && (ch=peek(s))!='(')
res[j++]=pop(&s);
}
res[j]='\0';
}

void push(st *s,char ch)
{
 s->ar[++s->top]=ch;
}

char pop(st *s)
{
 return s->ar[s->top--];
}

char peek(st s)
{
 return s.ar[s.top];
}

int isempty(st s)
{
 if(s.top==-1)
 return 1;
 else
 return 0;
}

int isfull(st s)
{
 if(s.top==max-1)
 return 1;
 else
 return 0;
}

int getpriority(char ch)
{
 switch(ch)
 {
  case '+':
  case '-': return 0;
  case '*':
  case '/':return 1;
 }
}
//postfix evaluation taking place
float pfixeval(char str[])
{
 float val1,val2,res;
 int i;
 st1 s;
 s.top=-1;
 for(i=0;str[i]!='\0';i++)
 {
  if(str[i]>=48 && str[i]<=57)
  push1(&s,str[i]-'0');
  else
  {
   val2=pop1(&s);
   val1=pop1(&s);
   switch(str[i])
   {
    case '+':res=val1+val2;
    break;
    case '-':res=val1-val2;
    break;
    case '*':res=val1*val2;
    break;
    case '/':res=(val1*1.0)/val2;
    break;
   }
   push1(&s,res);
  }
 }
return pop1(&s);
}

float pop1(st1 *s)
{
 return s->res[s->top--];
}

void push1(st1 *s,float p)
{
 s->res[++s->top]=p;
}

/* Expected I/O

Enter the expression (in digits only) to be evaluated in Infix form and rest is
our responsibility : (5*3)+(2*6)/3

The postfix expression is : 53*26*3/+

Evaluated result is : 19.000000 */

Leave a Reply