这个弹出功能是如何工作的



我想了解以行函数。

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;
}

相关内容

  • 没有找到相关文章

最新更新