在 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/