You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C++栈实现中show()函数的while循环条件为curr != NULL?

关于链表实现栈中show()函数while循环条件的解释

首先要明确:用链表实现的栈本质是单向链表的变体,每个栈节点(一般定义为Node结构体)包含两个核心部分:存储的数据字段,以及一个指向「下一个节点」的指针。

为什么栈的最后一个节点会指向NULL?

不管是初始化空栈,还是元素出栈到空,栈的top指针(指向栈顶元素的指针)都会被设为NULL。当你第一次push元素时,新创建的节点的next指针会被赋值为当前的top(也就是NULL),然后top更新为这个新节点——这就意味着最早入栈的栈底节点,它的next指针必然是NULL。

后续每一次push新元素,新节点的next都会指向当前的top(也就是上一个栈顶元素),然后top更新为新节点。最终栈的结构会是:top → 栈顶元素 → ... → 栈底元素 → NULL。

show()函数里while(curr != NULL)的作用

show()函数的逻辑通常是从栈顶开始遍历整个栈,输出所有元素。这里的curr是一个临时指针,初始时会被赋值为top(指向栈顶)。

循环条件curr != NULL的意思是:只要curr还指向一个有效存在的节点(非空),就继续执行循环体(比如输出节点的数据),然后把curr移动到下一个节点(curr = curr->next)。当curr变成NULL时,说明已经遍历到了栈底节点的下一个位置,所有节点都已经访问完毕,循环终止。

举个实际的例子:假设你依次push了1、2、3三个元素,栈的结构是top → 3 → 2 → 1 → NULL。遍历过程是:

  1. curr指向3,输出3,curr变为2
  2. curr指向2,输出2,curr变为1
  3. curr指向1,输出1,curr变为NULL
  4. 此时curr == NULL,循环结束

你可能疏漏的点

大概率是没注意到push操作中对新节点next指针的赋值逻辑,典型的push代码大概是这样的:

struct Node {
    int data;
    Node* next;
    Node(int val) : data(val), next(nullptr) {}
};

class Stack {
private:
    Node* top;
public:
    Stack() : top(nullptr) {}
    
    void push(int val) {
        Node* newNode = new Node(val);
        newNode->next = top;  // 新节点的next指向当前栈顶,空栈时top是NULL
        top = newNode;
    }
    
    void show() {
        Node* curr = top;
        while (curr != nullptr) {
            cout << curr->data << " ";
            curr = curr->next;
        }
        cout << endl;
    }
};

这里第一次push时,newNode->next被设为NULL,直接让栈底节点的next指向了空,这就是遍历终止的关键。

内容的提问来源于stack exchange,提问作者asvalk1672

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:32:44