这个pop功能如何工作?

时间:2014-12-05 13:31:43

标签: c++ linked-list

我想了解以下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).nexttop_node的类型list_node相同,就像一个包含键,下一个指针及其值的框。现在我无法理解top_node->next的真正含义。我知道接下来会成为下一个top_node指针,但为什么呢?

1 个答案:

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