无数组实现的泛型Push/Pop栈为何能仅靠Next和Data存储多元素
为什么无数组也能正常存储多个栈元素
这段代码是非常标准的单向链表实现的栈结构,从根上就不需要数组来存储实例或数据,运行逻辑完全成立。
核心存储逻辑
每个Entry就是链表上的独立节点,只带两个属性:
Data:存储当前节点对应的实际数据Next:存储同类型的节点引用,直接关联相邻的下一个栈元素
栈类本身只需要维护一个指向栈顶节点的引用(也就是代码里的_top字段),就能顺着节点之间的Next引用找到所有元素,全程不需要额外开数组存这些节点的引用。
逐次拆解三次Push的实际运行过程
- 刚初始化
Stack<int>时,内部的_top字段是引用类型的默认值null,没有关联任何节点。 - 执行
Push(100):
新建第一个Entry节点,构造时传入的next参数就是当前的_top(也就是null),data是100。最终这个节点的状态是Data=100, Next=null,随后把栈的_top指向这个新节点。 - 执行
Push(50):
新建第二个Entry节点,构造时传入的next参数是当前的_top(也就是刚才存100的节点实例),data是50。这个节点的状态是Data=50, Next=指向存100的节点,随后把栈的_top更新为这个存50的新节点。 - 执行
Push(45):
新建第三个Entry节点,构造时传入的next参数是当前的_top(也就是存50的节点实例),data是45。这个节点的状态是Data=45, Next=指向存50的节点,随后把栈的_top更新为这个存45的新节点。
三次Push全部完成后,所有节点在逻辑上的串联关系是:
_top→ [45, Next指向50的节点] → [50, Next指向100的节点] → [100, Next=null]
所有数据都是分散存在三个独立的Entry实例里的,没有任何数组参与存储,只是靠节点之间的Next引用,把散落在内存里的实例连成了逻辑上连续的序列。
Pop操作的对应逻辑
Pop全程也不需要额外的存储结构,只需要操作栈顶引用即可:
- 第一次Pop:取出当前
_top对应的Data值(45),然后把_top指向当前节点的Next引用(也就是存50的节点),返回45。 - 第二次Pop:取出当前
_top对应的Data值(50),把_top指向存50节点的Next引用(也就是存100的节点),返回50。 - 第三次Pop:取出当前
_top对应的Data值(100),把_top指向存100节点的Next引用(也就是null),返回100。
常见的认知偏差
你会产生“没有数组就存不下多个值”的疑惑,本质是平时接触的很多栈实现都是基于数组的——这类实现需要一块连续的内存空间顺次存放元素。但链式结构的核心是靠引用把分散在内存各处的独立节点关联成逻辑序列,既不需要连续内存,也不需要预先申请固定大小的存储块,栈类只需要攥住栈顶这一个头引用,就能完整管理整个栈的所有元素。
内容的提问来源于stack exchange,提问作者Owais Ahmed
相关产品推荐
相关产品推荐

