#include <stdio.h>
#include <conio.h>
#define max 100
typedef enum {lpar,rpar,min,pul,mul,div,mod,eos,operand} pre;
char expr[]={"a/b-c+d*e-a*c"};
int val[]={0,19,12,12,13,13,13,0};
pre stack[max];
int addQ(int *top,int item) ;
int delQ(int *top);
void print_token(pre token);
pre get_token(char *simbol,int *n);
/************************************************************/
main()
{
pre token;
char simbol;
int n=0,tops=0,i;
stack[0]=eos;
for(i=0,token=get_token(&simbol,&n);i<14;++i,token=get_token(&simbol,&n))
{
if(token==operand)
printf("%c",simbol);
else
if(val[token]>val[stack[tops]])
addQ(&tops,token);
else
{
while(tops!=0)
print_token(delQ(&tops));
addQ(&tops,token);
}
} //end for
getch();
}
/*******************************************************/
int addQ(int *tops,int item)
{
if(*tops==max-1)
return(125);
else
stack[++*tops]=item;
}
/*****************************************************/
int delQ(int *tops)
{
if(*tops==-1)
return(126);
return(stack[(*tops)--]);
}
/*********************************************/
pre get_token(char *simbol,int *n)
{
*simbol=expr[(*n)++];
switch(*simbol)
{
case "(":return lpar;
case ")":return rpar;
case "+":return pul;
case "*":return mul;
case "-":return min;
case "/":return div;
case "%":return mod;
case "\0":return eos;
default :return operand;
}
}
/***************************************************/
void print_token(pre token)
{
switch (token)
{
case lpar:printf("(");break;
case rpar:printf(")"); break;
case min:printf("-");break;
case pul:printf("+"); break;
case div:printf("/"); break;
case mod:printf("%"); break;
case mul:printf("*"); break;
}
}
|