Реализация стека C ++ (не работает правильно) - PullRequest
2 голосов
/ 23 января 2011

Вот предыдущая тема, где я получил помощь в этой же лаборатории. Мой стек плохо себя ведет, если не сказать больше, когда я добавляю элемент в стек, чтобы распечатать его позже, кажется, что он добавляется неправильно. Я всегда печатаю плюс '(+), неважно, если я введу другой операнд (*, /, +).

Я использую стек, чтобы преобразовать пользовательский инфиксный экспресс в постфикс. Кажется, он работает нормально, за исключением распечатки операндов в стеке в конце.

#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;  

Спасибо, Макайр Белл

Ответы [ 3 ]

1 голос
/ 23 января 2011

Ваш цикл вызывает front(), но затем вызывает pop_back().Это всегда будет возвращать первый элемент в векторе, пока все элементы не вытолкнут, так как вы никогда не стираете передний элемент.Ваш метод ReturnFront (), вероятно, должен быть:

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

А затем ваш цикл в конце:

   while(!DishTray.IsEmpty()){  
        counter++;  
        cout<<counter<<" Element "<<DishTray.ReturnBack()<<endl;  // will return last element
        DishTray.Pop();  // actually pop the element printed
    } 
1 голос
/ 23 января 2011

Когда вы работаете со стеком, вы обычно хотите видеть значение в верхней части стека. Ваш класс позволяет видеть только самый первый выдвинутый элемент (то есть, нижнюю часть стопки). Ваш ReturnFront (), вероятно, должен возвращать Well.back () и, возможно, он должен называться что-то вроде ReturnTop ().

0 голосов
/ 23 января 2011

Разве вы не хотели бы видеть значение, возвращаемое из pop_back () вместо этого, если отбрасываете его, как вы сейчас делаете?

...