An error in my c++ program... please help urgent.

The following is a program to convert an infix expression to postfix expression.

//Convert an infix expression to postfix expression...

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
char ifx[50],pfx[50],stk[50];
int top=-1,n;
void push(char ch)
{
    if(top!=n)
    {
        ch=stk[top];
        top++;
        cout<<"\nElement added was "<<ch;
    }
    else
        cout<<"\nThe stack is full.";    
}
void pop()
{
    char rmv;
    if(top!=-1)
    {
        rmv=stk[top];
        top--;
        cout<<"\nElement removed was "<<rmv;
    }
    else
        cout<<"\nThe stack is empty.";
}
char topele()
{
    char t;
    if(top!=-1)
        t=stk[top];
    else
    {
        t='#';
        cout<<"\nThere are no elements in the stack.The stack is: "<<t;
    }
    return t;
}
int chkpres()
{
    char ch;
    switch(ch)
    {
        case '^': return 5;
            break;
        case '*': return 4;
            break;
        case '/': return 3;
            break;
        case '+': return 2;
            break;
        case '-': return 1;
            break;
        default: exit(1);
            break;
    }
}
int main()
{
    char pre,pres,ele,elem,chk,popp,topp;
    cout<<"\nEnter how many elements you want to enter in the infix expression: ";
    cin>>n;
    for(int j=0;j<n;++j)
    {
        cout<<"\nEnter the characters of the infix expression one by one: ";
        cin>>ifx[j];
    }
    topp=topele();
    for(int i=0;ifx='\0';++i)
    {
        if(ifx=='(')
        {
            break;
        }
        if(ifx=='^'||ifx=='*'||ifx=='/'||ifx=='+'||ifx=='-')
        {
            if(topp=='^'||topp=='*'||topp=='/'||topp=='+'||topp=='-')
            {
                pre=ifx;
                pres=topp;
                chk=chkpres();
                if(pre>pres)
                {
                    topp=pre;
                    top++;
                }
                else if(pres>=pre)
                    pfx=pres;
            }    
        }
        else if(ifx=')')
        {
            while(topp!='#')
            {
                popp=topp;
                pfx=popp;
            }
        } 
    }
    cout<<"\nThe postfix expression is: ";
    for(int i=0;pfx!='\0';++i)
    {
        cout<<pfx;
    }
return 0;
}



Here's the output of the above program :

lab1.cpp:80: error: ISO C++ forbids comparison between pointer and integer

Please suggest me to resolve this problem...

Use code tags to post code. Not using them destroyed your formatting.

taking a look.

---------- Post updated at 09:44 AM ---------- Previous update was at 09:43 AM ----------

You forgot to dereference your array in one place: ifx=='+'

1 Like

Oh... thank you so much... I should have been able to notice that... Well, thank you again.

---------- Post updated 03-16-11 at 10:42 AM ---------- Previous update was 03-15-11 at 09:19 PM ----------

The program is:

//Convert an infix expression to postfix expression...

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
char ifx[50],pfx[50],stk[50];
int top=-1,n;
char push(char ch)
{
    if(top!=n)
    {
        ch=stk[top];
        top++;
        return ch;
    }
    else
        cout<<"\nThe stack is full.";    
}
void pop()
{
    char rmv;
    if(top!=-1)
    {
        rmv=stk[top];
        top--;
        cout<<"\nElement removed was "<<rmv;
    }
    else
        cout<<"\nThe stack is empty.";
}
char topele()
{
    char t;
    if(top==-1)
        t='#';
    else
        t=stk[top];
    return t;
}
int chkpres()
{
    char ch;
    switch(ch)
    {
        case '^': return 5;
            break;
        case '*': return 4;
            break;
        case '/': return 3;
            break;
        case '+': return 2;
            break;
        case '-': return 1;
            break;
        default: exit(1);
            break;
    }
}
int main()
{
    char pre,pres,ele,elem,chk,popp,topp;
    cout<<"\nEnter how many elements you want to enter in the infix expression: ";
    cin>>n;
    topp=stk[top];
    cout<<"\nEnter the characters of the infix expression one by one: ";
    for(int i=0;i<n;++i)
    {
        cin>>ifx;
        //for(int i=0;ifx='\0';++i)
        //{
            if(ifx!='^' && ifx!='*' && ifx!='/' && ifx!='+' && ifx!='-')
                pfx=ifx;
            else if(ele=='(')
            {
                ele=ifx;
                push(ele);
                top++;
            }
            else if(ifx=='^'||ifx=='*'||ifx=='/'||ifx=='+'||ifx=='-')
            {
                if(topp=='^'||topp=='*'||topp=='/'||topp=='+'||topp=='-')
                {
                    pre=ele;
                    pres=topp;
                    chk=chkpres();
                    if(pre>pres)
                    {
                        topp=pre;
                        top++;
                    }
                    else if(pres>=pre)
                        pfx=pres;
                }    
            }
            else if(ele=')')
            {
                while(topp!='#')
                {
                    popp=topp;
                    pfx=popp;
                }
            }
       // }
    }
    cout<<"\nThe postfix expression is: ";
    for(int i=0;pfx!='\0';++i)
    {
        cout<<pfx;
    }
return 0;
}

OUTPUT is:

Enter how many elements you want to enter in the infix expression: 9

Enter the characters of the infix expression one by one: a
*
(
b
+
c
)
/
d

The postfix expression is: a

Could you please help me to fix it...

The code you gave didn't even work as you showed it, it went into an infinite loop...

I've tried to clean it up a little, but there's problems I don't know how to fix since I don't know what you were actually trying to do:

//Convert an infix expression to postfix expression...

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
char ifx[50],pfx[50],stk[50];
int top=-1,n;
char push(char ch)
{
    if(top!=n)
    {
        ch=stk[top];
        top++;
        return ch;
    }
    else
        cout<<"\nThe stack is full.";
}
void pop()
{
    char rmv;
    if(top!=-1)
    {
        rmv=stk[top];
        top--;
        cout<<"\nElement removed was "<<rmv;
    }
    else
        cout<<"\nThe stack is empty.";
}
char topele()
{
    char t;
    if(top==-1)
        t='#';
    else
        t=stk[top];
    return t;
}
int chkpres()
{
    char ch;
    switch(ch)
    {
        case '^': return 5;
            break;
        case '*': return 4;
            break;
        case '/': return 3;
            break;
        case '+': return 2;
            break;
        case '-': return 1;
            break;
        default: exit(1);
            break;
    }
}
int main()
{
    int i;

    char pre,pres,ele,elem,chk,popp,topp;
    cout<<"\nEnter how many elements you want to enter in the infix expression: ";
    cin>>n;
    topp=stk[top];
    cout<<"\nEnter the characters of the infix expression one by one: ";

    // Make this its own loop to simplify the rest
    for(i=0;i<n;++i)
    {
        cin>>ifx;
    }
    // You can't assume the array will end in '\0', you have to put it there
    ifx='\0';

    // uncommented this.  It was a good idea, but didn't 
    // work before because you forgot the !
    for(i=0;ifx!='\0';++i)
    {
            // Is this really what you want it to do?  Nothing except letters
            // and brackets will make to the second if-statement.
            if(ifx!='^' && ifx!='*' && ifx!='/' && ifx!='+' && ifx!='-')
                pfx=ifx;
            // 'ele' may not even have been set yet, in which case its value will
            // be undefined.  Which could be (.  Or could be \xfe.  What do you
            // want 'ele' to be by default?  set it when you create the var.
            else if(ele=='(')
            {
                ele=ifx;
                push(ele);
                top++;
                // Shouldn't you set pfx to something here?  Otherwise it
                // will stay at an undefined value at index i -- possibly \0,
                // possibly garbage
            }
            else if(ifx=='^'||ifx=='*'||ifx=='/'||ifx=='+'||ifx=='-')
            {
                if(topp=='^'||topp=='*'||topp=='/'||topp=='+'||topp=='-')
                {
                    pre=ele;
                    pres=topp;
                    chk=chkpres();
                    if(pre>pres)
                    {
                        topp=pre;
                        top++;
                        // Shouldn't you set pfx to something here?  Otherwise it
                        // will stay at an undefined value at index i -- possibly \0,
                        // possibly garbage
                    }
                    else if(pres>=pre)
                        pfx=pres;
                }
            }
            // There is a huge difference between = and ==.
            // you were changing ele to ')' here.
            // 'ele' may not even have been set yet, either, see above.
            else if(ele==')')
            {
                while(topp!='#')
                {
                    popp=topp;
                    pfx=popp;
                }
            }
       // }
    }

    // You can't assume the array will end in '\0', you have to put it there
    pfx='\0';

    cout<<"\nThe postfix expression is: ";
    for(i=0; pfx!='\0'; ++i)
    {
        cout<<pfx;
    }
return 0;
}

So I can't fix it outright but I hope I've given you a better idea of what's going wrong.

1 Like

Why cannot I assume in my program the arrays ifx[] and pfx[] to end at '\0' ?
Because since these are string arrays, I think we should assume it to end with a null character.
Why we have to specify/initialize that the two arrays would end at null character?

Because any contents you don't initialize yourself are undefined.

You have it exactly backwards. A string doesn't define a NULL -- a NULL defines a string. You've got chars arrays, which are just integers but smaller and have no mysterious auto-setting properties. Would you expect setting a[0] to also set a[1] for int? You were just lucky enough to be using global vars that "usually" default to 0. Try that with stack variables and you're in for a big surprise.

If not you, then who?

Here, 'ele' is the element that we read from the infix expression (ifx[]) and I think i should not have used the 'elem' because its of no use in my program.
The following code compares between the elements present in the two stacks one by one.

Code:

        else if(ifx=='^'||ifx=='*'||ifx=='/'||ifx=='+'||ifx=='-')
            {
                 if(topp=='^'||topp=='*'||topp=='/'||topp=='+'||topp=='-')
                {
                    pre=ele;
                    // 'pre' is the current (i) element in the infix expression.
         
                    pres=topp;
                    // 'pres' is the topmost element of the stack. 
                    chk=chkpres();
                    // Here I'm checking the precedence of the operators.

                    if(pre>pres)
                    {
                        topp=pre;
                        top++;
                    }
                    else if(pres>=pre)
                         pfx=pres;
                }    
                else
                {
                    ele=ifx;
                    push(ele);
                }
                ++i;
            }
Well, I'm trying my level best to solve this hoping to come out with the appropriate result. Thank you very much for your patience.