为何C++栈实现中show()函数的while循环条件为curr != NULL?
首先要明确:用链表实现的栈本质是单向链表的变体,每个栈节点(一般定义为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。遍历过程是:
curr指向3,输出3,curr变为2curr指向2,输出2,curr变为1curr指向1,输出1,curr变为NULL- 此时
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

