Search code examples
cstringinfix-notation

Not able to figure out the logical error in my code


There is some logical error in my code but I'm not able to figure out what it is. When I run my code it doesn't give me desired results.

OUTPUT:

Enter an infix expression
2+3
2

I get 2 as my postfix expression whereas I should be getting 23+. Please see if anyone could help me out with this one.

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<ctype.h>
#define max 20
int top=-1;
char infix[max],postfix[max],stack[max];
char pop();
int empty();
void push(char );
int precedence(char );
void infix_to_postfix(char * ,char * );

void main()
{
clrscr();
printf("Enter an infix expression\n");
gets(infix);
infix_to_postfix(infix,postfix);
printf("%s",postfix);
getch();
}

void infix_to_postfix(char infix[max],char postfix[max])
{
int i=0,j=0;
char value,x;
for(i=0;infix[i]!='\0';i++)
{
value=infix[i];
if(isalnum(value))
{
postfix[j]=value;
j++;
}
else
{
if(value=='(')
push('(');
else
{
if(value==')')
{
while((x=pop())!='(')
{
postfix[j]=x;
j++;
}
}
else
{
while(precedence(value)<=precedence(stack[top])&&!empty())
{
x=pop();
postfix[j]=x;
j++;
}
push(value);
}
}
}
}

while(!empty())
{
x=pop();
postfix[j]=x;
j++;
}
postfix[j]='\0';
}

void push(char x)
{
if(top==max-1)
printf("stack overflow\n");
else
{
top++;
stack[top]=x;
}
}

char pop()
{
char x;
x=stack[top];
top--;
return x;
}

int empty()
{
if(top==-1)
return(0);
return(1);
}

int precedence(char value)
{
if(value=='(')
return(0);
if(value=='+'||value=='-')
return(1);
if(value=='*'||value=='/'||value=='%')
return(2);
return(3);
}

Solution

  • Generally, the logic of your code is OK except a return value mistake in the empty() function.
    In the empty(), it should return 1 while stack is empty.

      int empty(){
         if(top==-1)
            return(0);  <-- !!! here should return 1
         }  
    

    Otherwise,

    1. it will go into the while loop at while(precedence(value)<=precedence(stack[top])&&!empty()) even when stack is empty.
    2. And then postfix[j] = x may write a redundant 0(now top= -2) to postfix array.
    3. Finally,under the input 2+3, the postfix[] will be {'2','\0','3','+',...}, which result in the abnormal output 2.

    So, it will work after modifying the empty() function, such as

    int empty()
    {
        if(top==-1)
           return(1); // not return(0)
        return(0); 
    }
    

    Output:

    Enter an infix expression
    2+3
    23+