我想了解以行函数。
struct list_node{
int key;
list_node* next;
list_node(int k, list_node* n)
: key(k), next(n);
{}
};
class stapel{
private: list_node* top_node;
public: void pop (int value);
};
void stapel::pop()
{
list_node* p=top_node;
top_node=top_node -> next;
delete p;
}
我知道弹出函数会删除堆栈的最顶层节点。所以你有一个指针p
,它指向与指针top_node
相同的节点。我很难理解下一行。 top_node->next
的意思与(*top_node).next
相同,top_node
的类型为 list_node
,这就像一个由键、下一个指针及其值组成的框。现在我不明白top_node->next
的真正含义。我知道下一个将成为下一个top_node
指针,但为什么呢?
void stapel::pop()
{
list_node* p = top_node; // Get pointer to top of stack
top_node = top_node->next; // Find the next item in the stack, assign it to now be the top
delete p; // Delete the current top
}
你基本上告诉堆栈,新的"top"是曾经从顶部开始第二个的节点。然后删除顶部节点。
next
行的工作方式与"链表"的工作方式相同。当您构造堆栈(或链表)时,为每个节点分配该节点的值 ( key
) 和指向下一个节点的指针 ( next
)。
top_node = top_node->next;
只是获取当前节点的next
成员变量。该成员变量恰好是指向下一个节点的指针,该节点是在将当前节点插入堆栈时分配的。
编辑
正如@Edward所指出的,检查top_node
是否nullptr
也是一个好主意。如果是这样,则在尝试访问next
成员时会遇到异常。因此,您可以将此函数修改为:
void stapel::pop()
{
if (top_node == nullptr)
return;
list_node* p = top_node;
top_node = top_node->next;
delete p;
}