#include <stdio.h>
#include <conio.h>
#define max 100
/*******************************GLOBAL VARIABLES*******************************/
typedef enum {lparen,rparen,minus,plus,times,div,mod,eos,operand} precedence;
char expr[]={"a/b-c+(d*e)-a*c"};
int isp[]={0,19,12,12,13,13,13,0};
int icp[]={20,19,12,12,13,13,13,0};
precedence stack[max];
main()
{
/*-----------------------PORTOTYPE&DECLARTION--------------------------------*/
void addS(int *top,int item) ;
int delS(int *top);
void print_token(precedence token);
precedence get_token(char *simbol,int *n);
precedence token;
char simbol;
int n=0,tops=0,i;
stack[0]=0;
/*-----------------------------START------------------------------------------*/
while((token=get_token(&simbol,&n))!=eos)
{
if(token==operand)
printf("%c",simbol);
else if(token==rparen)
{
while(stack[tops]!=lparen)
print_token(delS(&tops));
delS(&tops);
}
else
{
while(icp[token]<=isp[stack[tops]])
print_token(delS(&tops));
addS(&tops,token);
}
}//END OF WHILE
while(token!=0)
{
print_token(token);
token=delS(&tops);
}
getch();
}
/*-------------------------------STACK_FULL----------------------------------*/
void stack_full(void)
{
puts("\n");
printf("stack over flow");
// halt;
}
/*------------------------------STACK_EMPTY----------------------------------*/
void stack_empty(void)
{
puts("\n");
printf("stack is empty");
// halt;
}
/*-----------------------------ADD TO STACK----------------------------------*/
void addS(int *tops,int item)
{
if(*tops==max-1)
stack_full();
else
stack[++*tops]=item;
}
/*----------------------------DELETE FROM STACK------------------------------*/
int delS(int *tops)
{
if(*tops==-1)
stack_empty();
return(stack[(*tops)--]);
}
/*-------------------------GET CHAR FROM EXPERSION----------------------------*/
precedence get_token(char *simbol,int *n)
{
*simbol=expr[(*n)++];
switch(*simbol)
{
case "(" :return lparen;
case ")" :return rparen;
case "+" :return plus;
case "*" :return times;
case "-" :return minus;
case "/" :return div;
case "%" :return mod;
case "\0":return eos;
default :return operand;
}
}
/*------------------------PRINT ENUM DATA------------------------------------*/
void print_token(precedence token)
{
switch (token)
{
case lparen : printf("(");break;
case rparen : printf(")"); break;
case minus : printf("-");break;
case plus : printf("+"); break;
case div : printf("/"); break;
case mod : printf("%"); break;
case times : printf("*"); break;
}
}