1: Infix to postfix
2: Postfix to infix
3: postfix to prefix
4: prefix to infix
*/
#include< stdio.h >
#include< conio.h >
#include< process.h >
typedef struct fix_tag
{
char s[30][30],dest[30];
char t1[2],t2[2];
char ch1[30],ch2[30],ch3[30];
int i,top;
}postfix;
struct stack1
{
char data[7][16];
int tos;
}s;
struct tree
{
char ch;
struct tree *next;
struct tree *prev;
}*stack[11];
//Functions for postfix to infix conversion
void p2iipush(struct tree *str,int *top2)
{
if(*top2<=0)
printf("Stack is Full \n");
else
{
stack[*top2]=str;
(*top2)--;
}
}
struct tree *p2iipop(int *top2)
{
struct tree *exp;
if(*top2>=10)
printf("Stack is Empty \n");
else
exp=stack[++(*top2)];
return exp;
}
void convert(char exp[],int* top2)
{
struct tree *op1,*op2,*temp;
int i;
for (i=0;exp[i]!='\0';i++)
if (exp[i] >='a'&&exp[i]<='z'||exp[i]>='A'&&exp[i]<='Z')
{
temp=(struct tree*)malloc(sizeof(struct tree));
temp->ch=exp[i];
temp->next=NULL;
temp->prev=NULL;
p2iipush(temp,top2);
}
else if(exp[i]=='+'||exp[i]=='-'||exp[i]=='*'||exp[i]=='/'||exp[i]=='^')
{
op1=p2iipop(top2);
op2=p2iipop(top2);
temp=(struct tree*)malloc(sizeof(struct tree));
temp->ch=exp[i];
temp->next=op1;
temp->prev=op2;
p2iipush(temp,top2);
}
}
void display2(struct tree *temp)
{
if(temp!=NULL)
{
display2(temp->prev);
printf("%c",temp->ch);
display2(temp->next);
}
}
//Functions for postfix to prefix convertion
void initialization(postfix *p)
{ p->i=0 ;
p->top=-1;
strcpy(p->dest,"");
}
void expression(postfix *p, char *c)
{
strcpy(p->dest,c) ;
}
void p2ppush(postfix *p,char *str)
{
if(p->top==30-1)
printf("\nStack Overflow\n");
else
{
p->top++;
strcpy(p->s[p->top],str) ;
}
}
void p2ppop(postfix *p,char *a)
{
if (p->top==-1)
printf("\nStack is empty\n") ;
else
{
strcpy (a,p->s[p->top]);
p->top--;
}
}
void trans(postfix *p)
{
while(p->dest[p->i]!='\0')
{
if (p->dest[p->i]==' ')
p->i++ ;
if(p->dest[p->i]=='%'||p->dest[p->i]=='*'||p->dest[p->i]=='-'||p->dest[p->i]=='+'||p->dest[p->i]=='/'||p->dest[p->i]=='$')
{
p2ppop(p,p->ch2);
p2ppop(p,p->ch3);
p->t1[0]=p->dest[p->i];
p->t1[1]='\0';
strcpy(p->ch1,p->t1);
strcat(p->ch1,p->ch3);
strcat(p->ch1,p->ch2);
p2ppush (p,p->ch1);
}
else
{
p->t1[0]=p->dest[p->i];
p->t1[1]='\0';
strcpy(p->t2,p->t1);
p2ppush(p,p->t2);
}
p->i++;
}
}
void display(postfix p)
{
char *t=p.s[0];
while(*t)
{
printf ("%c ",*t);
t++ ;
}
}
//Functions for infix to postfix conversion
void i2ppush(char symb,int* top,char* stack)
{
if(*top>=49)
{
printf("Stack overflow\n");
getch();
return;
}
else
{
*top=*top+1;
stack[*top]=symb;
}
}
char i2ppop(int* top,char* stack)
{
char item;
if(*top==-1)
{
printf("Stack is empty\n");
getch();
return(0);
}
else
{
item=stack[*top];
(*top)--;
}
return(item);
}
int preced(char ch)
{
if(ch==47)
{
return(5);
}
else if(ch==42)
{
return(4);
}
else if(ch==45||ch==43)
{
return(3);
}
else
return(2);
}
void in2post(char* infix,int* top,char* stack)
{
int len;
static int index=0,pos=0;
char symb,temp;
char postfix[40];
len=strlen(infix);
i2ppush('#',top,stack);
while(index
symb=infix[index];
switch(symb)
{
case '(':i2ppush(symb,top,stack);break;
case ')':temp=i2ppop(top,stack);
while(temp!='(')
{
postfix[pos]=temp;
pos++;
temp=i2ppop(top,stack);
}
break;
case '+':
case '-':
case '*':
case '/':
case '^':
while(preced(stack[*top])>=preced(symb))
{
temp=i2ppop(top,stack);
postfix[pos]=temp;
pos++;
}
i2ppush(symb,top,stack);
break;
default: postfix[pos++]=symb;
break;
}
index++;
}
while(*top>0)
{
temp=i2ppop(top,stack);
postfix[pos++]=temp;
}
postfix[pos++]='\0';
puts(postfix);
return;
}
//Functions for prefix to infix conversion
preinf(char prefix[])
{
int length,i,len;
char str1[20];
length=strlen(prefix);
for(i=length;i>=0;i--)
{
switch(prefix[i])
{
case '+':
case '-':
case '*':
case '/':
case '^':
{
str1[0]='(';
str1[1]='\0';
strcat(str1,p2ipop());
len=strlen(str1);
str1[len]=prefix[i];
str1[++len]='\0';
strcat(str1,p2ipop());
len=strlen(str1);
str1[len]=')';
str1[++len]='\0';
p2ipush(str1);
break;
}
default:
{
str1[0]=prefix[i];
str1[1]='\0';
p2ipush(str1);
}
}
}
printf("\nThe equivallent infix expression :%s",p2ipop());
}
p2ipush(char string[])
{
strcpy(s.data[s.tos],string);
s.tos++;
}
p2ipop()
{
s.tos--;
return(s.data[s.tos]);
}
void main()
{
postfix PF ;
char ch,exp[30],stack[50],infix[25],prefix[20],postexp[50];
int top=-1,c,*top2;
clrscr();
*top2 = 10;
printf("\n\t EXPRESSION CONVERSION\n\t***************************");
printf("\n\n1 Infix to postfix\n\n2 Prefix to infix\n\n3 Postfix to prefix\n\n4 Postfix to infix\n\n5 Exit\n\n");
do
{
printf("\nEnter your choice : ");
scanf("%d",&c);
switch(c)
{
case 1:printf("\nEnter the infix expression : ");//Infix to postfix
scanf("%s",infix);
in2post(infix,&top,stack);
break;
case 2:printf("\nEnter the prefix expression : ");//prefix to infix
scanf("%s",prefix);
preinf(prefix);
break;
case 3:initialization(&PF) ;
printf ("\nEnter any postfix expression with space : ");//postfix to prefix
scanf("%s",exp);
expression(&PF,exp) ;
trans(&PF) ;
printf("\nThe resultant Prefix expression is : ");//prefix to postfix
display(PF);
break;
case 4:printf("\nEnter the postfix expression : ");
scanf("%s",postexp);
convert(postexp,top2);
printf("\nThe Equivalant Infix expression is : ");
display2(p2iipop(top2));
break;
case 5:exit(0);
default:printf("\n\aWrong Choice");
}
printf("\n\n\nDo you want to continue?[y/n]:\n\n");
ch=getch();
}while(ch=='y'||ch=='Y');
getch();
}
--------------------------------------------output----------------------------------------------
EXPRESSION CONVERSION
*************************
1 Infix to postfix
2 Prefix to infix
3 Postfix to prefix
4 Postfix to infix
5 Exit
Enter your choice : 1
Enter the infix expression : a+b
ab+
Do you want to continue?[y/n]:y
Enter your choice : 2
Enter the prefix expression : +ab
The equivallent infix expression :(a+b)
Do you want to continue?[y/n]:y
Enter your choice : 3
Enter any postfix expression with space : ab+
The resultant Prefix expression is : + a b
Do you want to continue?[y/n]:y
Enter your choice : 4
Enter the postfix expression : ab+
The Equivalant Infix expression is : a+b
Do you want to continue?[y/n]:y
Enter your choice : 5
No comments:
Post a Comment