我想了解以下pop函数。
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;
}
我知道pop函数会删除堆栈的最顶层节点。所以你有一个指针p
,它指向同一个节点,如指针top_node
。我很难理解下一行。 top_node->next
表示(*top_node).next
和top_node
的类型list_node
相同,就像一个包含键,下一个指针及其值的框。现在我无法理解top_node->next
的真正含义。我知道接下来会成为下一个top_node
指针,但为什么呢?
答案 0 :(得分:3)
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;
}