【问题标题】:Linked list implementation of stack in C++C++中栈的链表实现
【发布时间】:2017-06-30 06:50:19
【问题描述】:

我正在尝试在堆栈中使用简单的 Push、Pop 和 Show 函数作为链表实现。我认为 Push 功能工作正常,但 Show 和 Pop 出现问题。每当我使用 Pop 函数时,我只会得到一个结果,而下一次它会显示“Stack Empty!!”。我认为我在做一个逻辑错误。请帮帮我。我正在使用 Turbo C++ 4.5。我在下面发布代码。提前致谢!

#include<iostream.h>
#include<conio.h>
#include<process.h>
struct node
{
    int data;
    node *link;
};
node *temp, *top;
void PUSH()
{
    temp=new node;
    cout<<"\nEnter data item:";
    cin>>temp->data;
    temp->link=NULL;
    if(top==NULL)
    {
        temp->link=top;
        top=temp;
    }
}

void POP()
{
    if(top==NULL)
    {
        cout<<"\nEmpty";
        return;
    }
    temp=top;
    top=top->link;
    cout<<"\nDeleted value is : "<<temp->data;
    temp->link=NULL;
    delete(temp);
}

void SHOW()
{
    if(top==NULL)
    {
        cout<<"\nEmpty!!";
        return;
    }
    while(temp!=NULL)
    {
        cout<<temp->data<<endl;
        temp=temp->link;
    }
}

void main()
{   int ch;
    do{
    cout<<"\nEnter your choice";
    cout<<"\n1.Push\n2.Pop\n3.Show\n4.Exit";
    cin>>ch;
    switch(ch)
    {
        case 1: PUSH();
        break;
        case 2: POP();
        break;
        case 3: SHOW();
        break;
        case 4: exit(0);
        break;
    }
    }while(ch!=4);
    getch();
}

【问题讨论】:

  • 看起来您在node *temp, *top; 中将top 初始化为NULL,但您在PUSH() 中检查了top 是否为NULL
  • 请阅读 OOP(你有 C++).. 也使用标准库 - 这已经用模板为你完成了
  • 你为什么使用古老的编译器?
  • 直到我通过高中,我只能坚持下去。

标签: c++ linked-list


【解决方案1】:

在第二次推送之后,您不会将 temp 节点链接到现有的“堆栈”。

if(top==NULL)
{
    temp->link=top;
    top=temp;
}

为什么需要这个?我猜你必须每次在 Push 方法中更新 top 节点。

【讨论】:

    【解决方案2】:

    首先,你需要弄清楚你关于通过链表实现堆栈的概念.....

    您的 PUSH 函数应该如下所示

    void PUSH()
    {
        temp=new node;
        cout<<"\nEnter data item:";
        cin>>temp->data;
        temp->link=NULL;
        if(top==NULL)
            top=temp;      
        else
        {
            temp->link=top;    
            top=temp;
        }
    }
    

    POP 函数被声明为 void,因此它不能返回任何值...正确的声明应该是

    void POP()
    {
    
        if(top==NULL)
        {
            cout<<"\nEmpty";
        }
        else
        {
            cout<<"\nDeleted value is : "<<top->data;
            temp=top;
            top=top->link;
            delete(temp);
        }
    
    }
    

    而在SHOW函数中,else部分应该是

            temp=top;
            while(temp!=NULL)
            {
                cout<<temp->data<<endl;
                temp=temp->link;
            }
    

    我建议你应该使用 Codeblocks,因为它的 UI 比 Turbo C++ 更简洁。

    你可以通过Stack Using Linked List in C++这个帖子理清你的概念

    【讨论】:

    • 谢谢,成功了!我知道,但我的学校限制我使用 Turbo,直到我通过高中。
    【解决方案3】:

    在您的PUSH 函数中,如果topNULL,您实际上只对新的node 执行任何操作,因此所有压入非空堆栈的操作都将被忽略(除了它们泄漏内存)。试试这样吧。

    void PUSH() {
        temp = new node;
        cout << "\nEnter data item:";
        cin >> temp->data;
        temp->link = top;
        top        = temp;
    }
    

    【讨论】:

    • 没关系,但我的 Pop 和 Show 功能仍然无法正常工作。他们只显示和删除最后的数据。请帮忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2019-03-04
    • 2020-01-16
    • 2013-03-17
    相关资源
    最近更新 更多