#include <iostream.h>
#include <stdlib.h> //for exit()
#include <conio.h>
#include <dos.h>
#define row 7
#define col 5
class revpol{
int top,rank;
char *stack_arr,*polish,*infix;
public:
int f(char); //Input precedence functionint g(char); //Stack precedence functionint r(char); //rank functionvoid push(char);
char pop();
char *concat(char *,char);
void suffix();//infix to suffix conversion functionvoid printStack();
void printSuffix();
void printRank();
void printInfix(char);
};
void revpol :: printInfix(char ch){
staticint y=row,x=col;
gotoxy(x,y++);
cout<<ch;
}
void revpol :: printStack(){
staticint x=col,y=row;
gotoxy(x+10,y++);
cout<<stack_arr;
}
void revpol :: printSuffix(){
staticint x=col,y=row;
gotoxy(x+30,y++);
cout<<polish;
}
void revpol :: printRank(){
staticint x=col,y=row;
gotoxy(x+50,y++);
cout<<rank;
}
int revpol :: f(char inputchar){
if(inputchar==')')
return(0);
elseif(inputchar=='+' || inputchar=='-')
return(1);
elseif(inputchar=='*' || inputchar=='/')
return(3);
elseif(inputchar=='^')
return(6);
elseif(inputchar>='a' || inputchar<='z')
return(7);
elseif(inputchar>='A' || inputchar<='Z')
return(7);
elseif(inputchar=='(')
return(9);
elsereturn(-99); //for error
}
int revpol :: g(char inputchar){
if(inputchar=='(')
return(0);
elseif(inputchar=='+' || inputchar=='-')
return(2);
elseif(inputchar=='*' || inputchar=='/')
return(4);
elseif(inputchar=='^')
return(5);
elseif(inputchar>='a' || inputchar<='z')
return(8);
elseif(inputchar>='A' || inputchar<='Z')
return(8);
elsereturn(-99); //for error
}
int revpol :: r(char inputchar){
if(inputchar=='+' || inputchar=='-' || inputchar=='*' || inputchar=='/'|| inputchar=='^')
return(-1);
elseif(inputchar>='a' || inputchar<='z')
return(1);
elseif(inputchar>='A' || inputchar<='Z')
return(1);
elsereturn(-99); //for error
}
void revpol :: push(char charin){
top++;
stack_arr[top]=charin;
stack_arr[top+1]='\0';
}
char revpol :: pop(){
char popdata;
popdata=stack_arr[top];
stack_arr[top]='\0';
top--;
return(popdata);
}
char * revpol :: concat(char *polish,char temp){
int i;
for(i=0;polish[i]!='\0';i++);
polish[i]=temp;
polish[i+1]='\0';
return(polish);
}
void revpol :: suffix(){
int i;
char next,temp;
//initialize the stack
top=0;
stack_arr[top]='(';
//Intialize output string and rank count
polish="";
rank=0;
textcolor(LIGHTGREEN);
gotoxy(2,24);
cprintf("E-Mail : find@myblog.com");
gotoxy(2,25);
cprintf("Website : http://dotnetguts.blogspot.com ");
gotoxy(1,1);
textcolor(LIGHTMAGENTA);
cprintf("*****INFIX TO POSTFIX (UNParanthesized)*****\r\n");
textcolor(WHITE);
cprintf("Enter Infix string : ");
cin>>infix;
infix=concat(infix,')');
textcolor(LIGHTBLUE);
gotoxy(2,5);
cprintf("INFIX");
gotoxy(15,5);
cprintf("STACK");
gotoxy(35,5);
cprintf("SUFFIX");
gotoxy(53,5);
cprintf("RANK");
gotoxy(15,6);
cout<<"(";
cout<<endl;
//Remove symbols with greater precedence from stackfor(i=0;infix[i]!='\0';i++){
//obtain next input symbol
next=infix[i];
cout<<endl;
printInfix(next);
if(top<0){
cout<<"\n\n\tInvali Infix";
getch();
exit(1);
}
while(f(next) < g(stack_arr[top])){
temp=pop();
polish=concat(polish,temp);
rank = rank + r(temp);
if(rank<1){
cout<<"\n\n\tInvalid Infix";
getch();
exit(1);
}
}
//Are there matching parentheses?if(f(next) != g(stack_arr[top]))
push(next);
else
temp=pop(); //here value in temp is of no use
delay(200);
printStack();
printSuffix();
printRank();
}
//Check whether expression is invalidif(rank!=1 || top!=-1){
textcolor(RED + BLINK);
cprintf("\r\n\r\nInvalid Infix");
}
else{
textcolor(LIGHTGREEN + BLINK);
cprintf("\r\n\r\nvalid Infix");
textcolor(YELLOW);
cprintf("\r\nSuffix : %s",polish);
}
_setcursortype(_NOCURSOR);
}
void main(){
clrscr();
revpol obj;
obj.suffix();
getch();
}