c++ - pop如何使用链表在堆栈中工作?

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

在 pop 函数中,top 之后分配给 temp , 它写成 top=top->link ,但是 top=top->link 怎么样?让它指向它的后节点?

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

编辑:cout添加到流行音乐中。现在让问题更具体,如何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();
}

最佳答案

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

改变:

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

到:

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

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

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

编辑:

你的逻辑应该是这样的:

空栈只有一个 null_ptr(顶部)

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

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

关于c++ - pop如何使用链表在堆栈中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37815759/

相关文章:

c++ - Boost.Python - 如何重新进入模块范围?

python - 寻找最近连接的图算法

c - 如何在链表中向后移动?

c++ - 将链表转换为二叉搜索树,执行操作并将树作为列表返回

c++ - 通过覆盖加入多个重叠的类?

c++ - 是否有可能以简单的方式统一使用 c++/lua 进行编程?

c - 最容易在C中实现在线排序数据结构

c++ - 将项目添加到双向链表的后面时遇到问题

c++ - cond_broadcast 和调度顺序

data-structures - 何时使用前序、后序和中序二叉搜索树遍历策略