#include<stdio.h>
#include<string.h>
#define LP 10
#define RP 20
#define OPERATOR 30
#define OPERAND 40
#define LPP 0
#define AP 1
#define SP 1
#define MP 2
#define DP 2
#define REMP 2
#define NONE 9
char infix[50], stack[40], postfix[50];
int top;
void InfixToPostfix();
int getType(char);
int getPrecedence(char);
void push(char);
char pop(void);
int main()
{
char ch;
do
{
top=-1;
printf("\nEnter an Infix expression : ");
gets(infix);
InfixToPostfix();
printf("Posfix expression is : %s \n", postfix);
printf("Do you want to convert one more(y/n) : ");
ch = getche();
}while(ch=='y');
return 0;
}
void InfixToPostfix()
{
int i, p, l, type, prec;
char next;
i=p=0;
l=strlen(infix);
while(i<l)
{
type = getType(infix[i]);
switch(type)
{
case LP : push(infix[i]);
break;
case RP : while((next=pop()) != '(')
{
postfix[p] = next;
++p;
}
break;
case OPERAND : postfix[p] = infix[i];
++p;
break;
case OPERATOR : prec = getPrecedence(infix[i]);
while((top>-1) && (prec<=getPrecedence(stack[top])))
{
postfix[p] = pop();
++p;
}
push(infix[i]);
break;
}
++i;
}
while(top > -1)
{
postfix[p] = pop();
++p;
}
}
int getType(char sym)
{
switch(sym)
{
case '(' : return LP;
case ')' : return RP;
case '+' :
case '-' :
case '*' :
case '/' :
case '%' : return OPERATOR;
default : return OPERAND;
}
}
int getPrecedence(char sym)
{
switch(sym)
{
case '(' : return LPP;
case '+' : return AP;
case '-' : return SP;
case '*' : return MP;
case '/' : return DP;
case '%' : return REMP;
default : return NONE;
}
}
void push(char sym)
{
++top;
stack[top] = sym;
}
char pop(void)
{
char sym;
sym = stack[top];
--top;
return sym;
}
No Comments