【问题标题】:How pop is working in stack using linked list?pop 如何使用链表在堆栈中工作?
【发布时间】:2016-10-15 09:46:19
【问题描述】:

这里在pop函数中,top赋值给temp后,写成top=top->link,但是top=top->link怎么让它指向它的后节点呢?

top=top->link 意味着向前移动并指向其前面的节点,这里应该是NULL

编辑:cout 添加到 pop。现在让问题更具体,cout<<top->data 将如何打印 32 ?它应该指向NULL

#include<iostream>
using namespace std;

class stack_ll{
    private:
        struct node{
            int data;
            node *link;
        }*top;

    public:
        stack_ll()
        {
            top=NULL;
        }
        void push(int);
        void pop();
        void display();

        ~stack_ll()
        {
            if(top==NULL)
            return;

            node *temp;
            while(top!=NULL)
            {
                temp=top;
                top=top->link;
                delete temp;
            }
        }
};

void stack_ll::push(int num)
{
    node *temp;
    temp=new node;

    if(temp==NULL) {
    cout<<"stack is full"<<endl;
    return;
    }

    temp->data=num;
    temp->link=top;
    top=temp;

}

void stack_ll::pop(){
    if(top==NULL)
    {
        cout<<"stack is empty"<<endl;
        return;
    }

    node * temp;
    int item;

    temp=top;
    item=temp->data;
    top=top->link;
    cout<<top->data<<endl;
    delete temp;

}

int main()
{
    stack_ll l1;
    l1.push(5);
    l1.push(56);
    l1.push(32);
    l1.push(34);
    l1.pop();
    l1.push(23);
    l1.pop();
}

【问题讨论】:

  • @FirstStep:你在说什么?链接指向下方。 top-&gt;link 指向下一个元素,即弹出后的新顶部。

标签: c++ data-structures linked-list stack


【解决方案1】:

你是对的。 Pop here 将删除第一个对象,即使堆栈中有一些对象,现在也会将 top 设置为 NULL。你应该做些什么来解决这个问题,就是改变链接方向——这意味着每个对象都指向较低的对象。在这种情况下,当移除顶部时,您将能够检索下一个对象,即堆栈中较低的对象

改变:

temp->data=num;
temp->link=top;
top=temp;

到:

temp->data=num;
top->link=temp;
top=temp;

并为空堆栈添加一个特殊情况,其中top-&gt;link=temp; 将不合法,例如:

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

编辑

你的逻辑应该是这样的:

空栈只有一个 null_ptr (top)

push: 如果栈为空 - 顶部现在是新元素并且它的链接是 null_ptr,否则 - 顶部的链接现在是新元素,顶部成为新元素并且新元素的链接是 null_ptr

pop: 如果栈为空什么都不做,否则打印top的数据,将top保存为temp,top成为top的链接(栈中的较低元素),打印temp的数据并删除temp

【讨论】:

  • 不,但我想问的是,如果你放一个 coutdata;在 pop 结束时,它将显示当前的最后一个元素。但是如果 top=top->link 应该移动到 NULL 怎么会发生这种情况呢?
  • 您应该在将 null 分配给顶部之前打印。 pop 函数应该是这样的: if top != null print top.分配顶部->链接到顶部
  • 您误会了:OP 的代码本来就很好。什么都不需要改变。操作员是在问它为什么有效,而不是关于问题。
【解决方案2】:

这个实现是正确的。您无需更改任何内容。

推送的工作

当我们尝试添加一个元素是这个堆栈时,我们创建一个新节点并使其成为链接列表的头部。因此,最后添加的元素将始终是链接列表的头部。

流行音乐的工作

当我们尝试弹出一个元素时,我们只需执行 top- = top->link。这意味着我们只是将头节点更改为添加到堆栈中的前一个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2013-12-21
    • 2013-04-20
    • 2013-02-16
    • 2021-11-23
    • 2015-05-24
    相关资源
    最近更新 更多