Java最小栈实现中peek().min是否返回栈内最小值?
关于
peek().min的作用解答 首先明确两个核心前提:
- 你用到的栈的每个节点存储的不是单纯的int数值,而是
NodeWithMin类的实例,这个类包含两个公开属性:value:当前节点存储的元素值min:从栈底到当前节点为止,栈内所有元素的最小值
- 父类
Stack的peek()方法返回的是栈顶节点存储的NodeWithMin实例,不是int数值。
所以peek().min的作用就是:获取栈顶NodeWithMin实例中存储的、截止当前栈顶位置的全栈最小值,这也是这个最小栈实现O(1)复杂度求最小值的核心逻辑。
结合你的代码执行流程验证
你main方法里的三次压栈操作执行逻辑如下:
- 第一次执行
obj.push(8)
调用min()时栈为空,返回Integer.MAX_VALUE,计算得新最小值Math.min(8, Integer.MAX_VALUE) = 8,创建NodeWithMin(8, 8)压入栈。此时调用min()就会返回peek().min = 8。 - 第二次执行
obj.push(3)
调用min()时栈非空,peek()拿到栈顶的NodeWithMin(8,8)实例,取min属性值为8,计算得新最小值Math.min(3,8)=3,创建NodeWithMin(3,3)压入栈。此时调用min()返回peek().min =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
相关产品推荐
相关产品推荐

