如何使用链表在堆栈中使用pop?

时间:2016-06-14 15:06:03

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

在pop函数中,top分配给temp后,其top=top->link已写入top=top->link,但top=top->link如何指向其后节点?

NULL意味着前进并指向前面的节点,此处应为cout

编辑:cout<<top->data添加了pop。现在更具体地提出问题,NULL将如何打印32?它应该指向#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(); }

 <span ng-class="{'glyphicon glyphicon-star' : stack.favorite, 'glyphicon glyphicon-star-empty' : !stack.favorite}" style="float:right;padding-right:10px;padding-top:6px;"ng-click="toggleFavoriteStack(stack,'User');">
                                    </span>

2 个答案:

答案 0 :(得分:3)

你是对的。弹出这里将删除第一个对象,现在将顶部作为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(顶部)

push:如果stack为空 - top现在是新元素,它的链接是null_ptr,否则 - top的链接现在是新元素,top变成新元素,new元素的链接是null_ptr

pop:如果stack为空则不执行任何操作,否则 - 打印top的数据,将top保存为temp,top变为top的链接(stack中的下部元素),print temp的数据并删除temp

答案 1 :(得分:1)

此实施是正确的。你不需要改变任何东西。

推动工作

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

Pop的工作

当我们尝试弹出一个元素时,我们只需要做top- = top-&gt;链接。这意味着我们只是将头节点更改为堆栈中添加的前一个元素。