You are on page 1of 3

#include <stdio.

h>
#include <ctype.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define STACK_SIZE 80
char stack[STACK_SIZE];
typedef int Boolean;
Boolean stack_empty,stack_full;
enum symbol_type {letter, oper, left_paren, right_paren};
int top_of_stack;
char pop (void);
void push(char g_ch);
int precedence(char s);
enum symbol_type nature_of(char sc_ch);
void main()
{
int i,k,in_str_len,len_postfix;
char scanned_char,infix_string[80],postfix_string[80],stack_char;
Boolean stack_prec_low,match_found,error_flag;
/*Initialize variables*/
stack_prec_low=TRUE;
stack_empty=TRUE;
stack_full=FALSE;
top_of_stack=0;
i=0,k=0;
gets(infix_string);
in_str_len=strlen(infix_string);
scanned_char=infix_string[0];
while(i < in_str_len)
{
switch(nature_of(scanned_char))
{
case letter:
postfix_string[k]=scanned_char;
++k;
break;
case oper:
if(stack_empty)
{
push(scanned_char);
break;
}
else
{
do{
stack_char=pop();
if(precedence(stack_char)>=precedence(scanned_char))
{
postfix_string[k]=stack_char;
++k;
stack_prec_low=FALSE;
}
else
stack_prec_low=TRUE;
}while((!stack_prec_low) &&
(!stack_empty));
}/* end of else block */
if(stack_prec_low)
{
push(stack_char);
push(scanned_char);
}
else
push(scanned_char);
break;/* End of case oper*/
case left_paren:
push(scanned_char);
break;
case right_paren:
do{
stack_char=pop();
if(stack_char =='(')
match_found=TRUE;
else
{
postfix_string[k]=stack_char;
++k;
match_found =
FALSE;
}
}while((!match_found)&&(!stack_empty));
if(!match_found)
{
printf("Matching left paranthesis
not found\n");
error_flag=TRUE;
exit(1);
}
break;/*End of case right_paren*/
default:
error_flag=TRUE;
printf("Error in scanned character\n");
exit(1);
break;
}/*End of switch statement*/
++i;
scanned_char=infix_string[i];
}/*End of while (i < in_str_len)*/
/*Now take out all the operators left in the stack*/
while(!stack_empty)
{
stack_char=pop();
postfix_string[k]=stack_char;
++k;
}
postfix_string[k]='\0';
len_postfix=k-1;
printf("Infix expression :");
for(i=0;i<in_str_len;i++)
putchar(infix_string[i]);
printf("\n\n Postfix Expression :");
for(i=0;i<k;i++)
putchar(postfix_string[i]);
printf("\n");
}/* End of main*/
enum symbol_type nature_of(char scanned_char)
{
if(isupper(scanned_char))
return(letter);
if((scanned_char == '-')||(scanned_char == '+')||(scanned_char == '*')||(scanned
_char ==
'/'))
return(oper);
if(scanned_char=='(')
return(left_paren);
if(scanned_char==')')
return(right_paren);
}
int precedence(char given_char)
{
switch(given_char)
{
case '*': return(4);break;
case '/': return(4);break;
case '+': return(3);break;
case '-': return(3);break;
case '(': return(2);break;
case ')': return(2);break;
default: printf("error in given_char\n");break;
}
}
void push(char pushed_char)
{
if(stack_full)
{
printf("Error - stack is full\n");
return;
}
else
{
++top_of_stack;
stack[top_of_stack]=pushed_char;
stack_empty=FALSE;
}
if(top_of_stack==STACK_SIZE)
stack_full==TRUE;
}
char pop()
{
char temp;
if(stack_empty)
{
printf("error-stack is empty\n");
return('');
}
else
{
temp=stack[top_of_stack];
--top_of_stack;
if(top_of_stack<=0)
stack_empty=TRUE;
return(temp);
}
}

You might also like