Malaken
Malaken

Reputation: 103

C++ Stack Implementation (not working right)

Here's the previous thread where I got help with this same lab. My stack is misbehaving, to say the least, when I add an item to stack, to print out later, it doesn't seem to add right. I always print out plus'(+), not matter if I enter another operand(*,/,+).

I am using a stack to convert a, user inputed, infix express to postfix. It seems to work fine except printing out the operands in the stack at the end.

#include <iostream>;  
#include <vector>  
using namespace std;  

class DishWell{  
public:  
    char ReturnFront(){  
        return Well.front();  
    }  
    void Push(char x){  
        Well.push_back(x);  
    }  
    void Pop(){  
        Well.pop_back();  
    }  
    bool IsEmpty(){  
        return Well.empty();  
    }  
private:  
    vector<char> Well;  
};  

bool Precidence(char Input, char Stack){  
    int InputPrecidence,StackPrecidence;  
    switch (Input){  
        case '*':  
            InputPrecidence = 4;  
            break;  
        case '/':  
            InputPrecidence = 4;  
            break;  
        case '+':  
            InputPrecidence = 3;  
            break;  
        case '-':  
            InputPrecidence = 3;  
            break;  
        case '(':  
            InputPrecidence = 2;  
            break;  
        default:  
            InputPrecidence = 0;  
    }  
switch (Stack){  
    case '*':  
        StackPrecidence = 4;  
        break;  
    case '/':  
        StackPrecidence = 4;  
        break;  
    case '+':  
        StackPrecidence = 3;  
        break;  
    case '-':  
        StackPrecidence = 3;  
        break;  
    case '(':  
        StackPrecidence = 2;  
        break;  
    default:  
        StackPrecidence = 0;  
}  
if(InputPrecidence>StackPrecidence) return true;  
else return false;  
}  

int main(int argc, char** argv) {  
    DishWell DishTray;  
    char Input;  
    bool InputFlag;  
    InputFlag = true;  
    cout<<"Enter Input, invalid input will terminate"<<endl;  
    while(InputFlag){  
        cout<<"Input: ";  
        cin>>Input;  
        cout<<endl;  
        if((((Input>='a'&&Input<='z')||(Input>='A'&&Input<='Z'))||Input>='0'&&Input<='9')))//If Digit or Number
            cout<<Input;  
        if((Input=='*'||Input=='/'||Input=='+'||Input=='-')){//if operand  
            if(DishTray.IsEmpty())  
                DishTray.Push(Input);  
            else if(Precidence(Input,DishTray.ReturnFront()))  
                DishTray.Push(Input);  
            else if(!Precidence(Input,DishTray.ReturnFront()))  
                cout<<"Output: "<<Input<<endl;  
        }  
        else if(!((((Input>='a'&&Input<='z')||(Input>='A'&&Input<='Z'))||(Input>='0'&&Input<='9')))||((Input=='*'||Input=='/'||Input=='+'||Input=='-')))//if not digit/numer or operand  
            InputFlag = false;  
    }  
    int counter = 0;  
    while(!DishTray.IsEmpty()){  
        counter++;  
        cout<<counter<<" Element "<<DishTray.ReturnFront()<<endl;  
        DishTray.Pop();  
    }  
    return 0;  

Thank you, Macaire Bell

Upvotes: 2

Views: 266

Answers (3)

Ferruccio
Ferruccio

Reputation: 100638

When you're working with a stack, you usually want to be able to see the value on the top of the stack. Your class only allows the very first item pushed (i.e. the bottom of the stack) to be visible. Your ReturnFront() should probably return Well.back() and perhaps it should be called something like ReturnTop().

Upvotes: 1

JaredC
JaredC

Reputation: 5300

Your loop calls front(), but then calls pop_back(). This will always return the first element in the vector, until all elements are popped, since you are never erasing the front element. Your ReturnFront() method should probably be:

char ReturnBack(){  
    return Well.back();  
}  

And then your loop at the end:

   while(!DishTray.IsEmpty()){  
        counter++;  
        cout<<counter<<" Element "<<DishTray.ReturnBack()<<endl;  // will return last element
        DishTray.Pop();  // actually pop the element printed
    } 

Upvotes: 1

user122299
user122299

Reputation:

Wouldn't you want to see the value returned from pop_back() instead if discarding it as you're currently doing?

Upvotes: 0

Related Questions