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

Java最小栈实现中peek().min是否返回栈内最小值?

关于peek().min的作用解答

首先明确两个核心前提:

  • 你用到的栈的每个节点存储的不是单纯的int数值,而是NodeWithMin类的实例,这个类包含两个公开属性:
    • value:当前节点存储的元素值
    • min:从栈底到当前节点为止,栈内所有元素的最小值
  • 父类Stack的peek()方法返回的是栈顶节点存储的NodeWithMin实例,不是int数值。

所以peek().min的作用就是:获取栈顶NodeWithMin实例中存储的、截止当前栈顶位置的全栈最小值,这也是这个最小栈实现O(1)复杂度求最小值的核心逻辑。

结合你的代码执行流程验证

你main方法里的三次压栈操作执行逻辑如下:

  1. 第一次执行obj.push(8)
    调用min()时栈为空,返回Integer.MAX_VALUE,计算得新最小值Math.min(8, Integer.MAX_VALUE) = 8,创建NodeWithMin(8, 8)压入栈。此时调用min()就会返回peek().min = 8。
  2. 第二次执行obj.push(3)
    调用min()时栈非空,peek()拿到栈顶的NodeWithMin(8,8)实例,取min属性值为8,计算得新最小值Math.min(3,8)=3,创建NodeWithMin(3,3)压入栈。此时调用min()返回peek().min =3。
  3. 第三次执行obj.push(5)
    调用min()时peek()拿到栈顶的NodeWithMin(3,3)实例,取min属性值为3,计算得新最小值Math.min(5,3)=3,创建NodeWithMin(5,3)压入栈。此时调用min()返回peek().min =3。

这也是你main方法最终输出结果为3的原因。

这个设计的优势是不管压栈还是弹栈,获取最小值的时间复杂度永远是O(1),不需要遍历整个栈计算:弹栈时直接移除栈顶节点即可,剩下的栈顶节点的min属性就是剩余栈的最小值,无需额外更新计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:27:03