Vendetta Hazard
Vendetta Hazard

Reputation: 5

C++ Postfix calculator using stacks

I'm trying to a postfix expression calculator but I stuck on a problem. The calculator returns the wrong answer and I don't know why. I've followed the program line by line and nothing should be wrong. heres my code so far:

char expression[] = {"321*+"};

int number1, number2;
char *pExpression = &expression[0];
char symbole;
PileInt pile;
pile.init(5);

while(*pExpression){
    symbole = *pExpression;
    if(symbole == '+' || symbole == '-' || symbole == '*' || symbole == '/'){
        switch (symbole){
            case '+':
                number2 = pile.pop();
                number1 = pile.pop();
                pile.push(number1 + number2);
                break;
            case '-':
                number2 = pile.pop();
                number1 = pile.pop();
                pile.push(number1 - number2);
                break;
            case '*':
                number2 = pile.pop();
                number1 = pile.pop();
                pile.push(number1 * number2);
                break;
            case '/':
                number2 = pile.pop();
                number1 = pile.pop();
                pile.push(number1 / number2);
                break;
        }
    } else pile.push(symbole);

    pExpression++;
}
cout<<pile.pop()<<endl;

and heres the methods:

void PileInt::init(int taille){  //Methode pour initialiser une pile d'entier
    _addr = new int [ _taille = taille ];
    assert( _addr != 0 );
    _sommet = 0;
}


void PileInt::push(int n){  //Methode pour mettre un entier au dessus de la pile
    if ( ! pleine() )
    _addr[ _sommet++ ] = n;
}


int PileInt::pop(){  //Methode pour sortir l'entier au dessus de la pile
    return ( ! vide() ) ? _addr[ --_sommet ] : 0;
}


int PileInt::top(){
    if( ! vide() )
        return (_sommet - 1);
}

expression: 321*+ Console returns 2501, it should return 5. Thank you in advance.

Upvotes: 0

Views: 6835

Answers (1)

Ed Heal
Ed Heal

Reputation: 59997

When you have a number - you are pushing on its ASCII value.

You need to push on its value so change

pile.push(symbole);

to

pile.push(symbole - '0');

Upvotes: 4

Related Questions