【问题标题】:C++ Stack Implementation (not working right)C++ 堆栈实现(不能正常工作)
【发布时间】:2011-06-13 21:28:06
【问题描述】:

这是我在同一个实验室获得帮助的上一个帖子。至少可以说,我的堆栈行为不端,当我将一个项目添加到堆栈中以稍后打印出来时,它似乎没有正确添加。我总是打印出 plus'(+),不管我输入另一个操作数(*,/,+)。

我正在使用堆栈将用户输入的中缀表达转换为后缀。除了在最后打印出堆栈中的操作数之外,它似乎工作正常。

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

谢谢你,麦凯尔·贝尔

【问题讨论】:

    标签: c++ stl stack


    【解决方案1】:

    您的循环调用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
        } 
    

    【讨论】:

    • 啊 k 我明白了,我实际上已经回到了上一篇文章中。以为我的逻辑是错误的,我回到/前面/第一个/最后一个困惑。我应该将所有前面的功能都改回正确的吗?
    【解决方案2】:

    当您使用堆栈时,您通常希望能够看到堆栈顶部的值。你的类只允许第一个被推送的项目(即堆栈的底部)是可见的。您的 ReturnFront() 可能应该返回 Well.back(),也许它应该被称为 ReturnTop()。

    【讨论】:

      【解决方案3】:

      如果像您当前所做的那样丢弃它,您不想看到从 pop_back() 返回的值吗?

      【讨论】:

      • 哇!就像魅力一样,C++ 每年都在变得不那么痛苦。再次感谢。对于我所做的比较的任何建议,它们有点冗长。 (((输入>='a'&&Input='A'&&Input='0'&&Input
      猜你喜欢
      • 2021-03-04
      • 1970-01-01
      • 2011-09-30
      • 2010-11-27
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 2011-12-04
      • 2023-03-13
      相关资源
      最近更新 更多