为了实现一个支持在 O(1) 时间内获取最大值的栈结构,我们可以使用两个栈:一个主栈用于存储所有的元素,另一个辅助栈用于存储当前的最大值。每次在主栈中压入或弹出元素时,我们同步更新辅助栈,以确保辅助栈的栈顶始终是当前主栈中的最大值。
下面是该栈结构的实现:
pythonCopy Codeclass MaxStack: def __init__(self):
self.stack = [] # 主栈,用于存储所有元素
self.max_stack = [] # 辅助栈,用于存储当前的最大值
def push(self, x: int) -> None:
self.stack.append(x) # 如果辅助栈为空,或者当前元素大于等于辅助栈的栈顶,则将其压入辅助栈
if not self.max_stack or x >= self.max_stack[-1]:
self.max_stack.append(x) def pop(self) -> int: if not self.stack: raise IndexError("pop from empty stack") # 如果主栈弹出的元素等于辅助栈的栈顶,则同步弹出辅助栈的栈顶
top = self.stack.pop() if top == self.max_stack[-1]:
self.max_stack.pop() return top def top(self) -> int: if not self.stack: raise IndexError("top from empty stack") return self.stack[-1] def get_max(self) -> int: if not self.max_stack: raise IndexError("get_max from empty stack") return self.max_stack[-1]# 使用示例max_stack = MaxStack()
max_stack.push(5)
max_stack.push(1)
max_stack.push(5)print(max_stack.get_max()) # 输出: 5max_stack.pop()print(max_stack.get_max()) # 输出: 5max_stack.pop()print(max_stack.get_max()) # 输出: 5max_stack.pop()# print(max_stack.get_max()) # 这将引发异常,因为栈为空
代码说明:
-
stack:主栈,用于存储所有的元素。 -
max_stack:辅助栈,用于存储当前的最大值。 -
push方法:将元素压入主栈,同时检查该元素是否大于或等于辅助栈的栈顶元素。如果是,则将其压入辅助栈。 -
pop方法:从主栈弹出元素,同时检查该元素是否等于辅助栈的栈顶元素。如果是,则同步弹出辅助栈的栈顶。 -
top方法:返回主栈的栈顶元素。 -
get_max方法:返回辅助栈的栈顶元素,即当前主栈中的最大值。
这种实现方式确保了在 O(1) 时间内获取最大值,因为辅助栈的栈顶始终是当前主栈中的最大值。
http://www.zgjzs.org
http://www.shangpin.org
http://www.snjrw.org
http://wangluo.zgjzs.org
http://zhineng.zgjzs.org
http://gaosu.zgjzs.org
http://anquan.zgjzs.org
http://wangzhan.zgjzs.org
http://jiaoyu.zgjzs.org
http://guanggao.zgjzs.org
http://shuju.zgjzs.org
http://zhifu.zgjzs.org
http://yingyong.zgjzs.org
http://yonghu.zgjzs.org
http://houtai.zgjzs.org
http://fenxi.zgjzs.org
http://jiekou.zgjzs.org
http://fenxiang.zgjzs.org
http://neirong.zgjzs.org
http://zhuce.zgjzs.org
http://tongji.zgjzs.org
http://ditu.zgjzs.org
http://tuisong.zgjzs.org
http://gouwu.zgjzs.org
http://tuiguang.zgjzs.org
http://shejiao.zgjzs.org
http://zhongguo.zgjzs.org
http://wangguan.zgjzs.org
http://yule.zgjzs.org
http://pingtai.zgjzs.org
http://jichu.zgjzs.org
http://wangjie.zgjzs.org
http://zhishi.zgjzs.org
http://shangcheng.zgjzs.org
http://dianzi.zgjzs.org
http://yinyue.zgjzs.org
http://tupian.zgjzs.org
http://shipin.zgjzs.org
http://wuliu.zgjzs.org
http://gongju.zgjzs.org
http://anquan.zgjzs.org
http://sousuo.zgjzs.org
http://mima.zgjzs.org
http://jiankong.zgjzs.org
http://ceshi.zgjzs.org
http://wangyou.zgjzs.org
http://zixun.zgjzs.org
http://chajian.zgjzs.org
http://kuaidi.zgjzs.org
http://liuliang.zgjzs.org
http://zhengce.zgjzs.org
http://peizhi.zgjzs.org
http://baocun.zgjzs.org
http://yonghu.shangpin.org
http://houtai.shangpin.org
http://pingtai.shangpin.org
http://wangzhan.shangpin.org
http://zhifu.shangpin.org
http://guanggao.shangpin.org
http://yinyue.shangpin.org
http://zixun.shangpin.org
http://shejiao.shangpin.org
http://tuisong.shangpin.org
http://wangguan.shangpin.org
http://zhineng.shangpin.org
http://wangluo.shangpin.org
http://anquan.shangpin.org
http://zhongguo.shangpin.org
http://shuju.shangpin.org
http://jiekou.shangpin.org
http://zhishi.shangpin.org
http://gongneng.shangpin.org
http://tongji.shangpin.org
http://shipin.shangpin.org
http://jiaoyu.shangpin.org
http://ditu.shangpin.org
http://dianzi.shangpin.org
http://mima.shangpin.org
http://liuliang.shangpin.org
http://gouwu.shangpin.org
http://zhengce.shangpin.org
http://yule.shangpin.org
http://baocun.shangpin.org
http://jichu.shangpin.org
http://fenxi.shangpin.org
http://fenxiang.shangpin.org
http://shangcheng.shangpin.org
http://kuaidi.shangpin.org
http://peizhi.shangpin.org
http://wuliu.shangpin.org
http://ceshi.shangpin.org
http://tupian.shangpin.org
http://wangyou.shangpin.org
http://chajian.shangpin.org
http://tuiguang.shangpin.org
http://yingyong.shangpin.org
http://zhuce.shangpin.org
http://sousuo.shangpin.org
http://jiankong.shangpin.org
http://neirong.shangpin.org
http://gongju.shangpin.org
http://zonghe.shangpin.org
http://zhifu.snjrw.org
http://houtai.snjrw.org
http://yule.snjrw.org
http://wangluo.snjrw.org
http://guanggao.snjrw.org
http://shuju.snjrw.org
http://pingtai.snjrw.org
http://ditu.snjrw.org
http://wangzhan.snjrw.org
http://shejiao.snjrw.org
http://jiekou.snjrw.org
http://zhishi.snjrw.org
http://zhineng.snjrw.org
http://jiaoyu.snjrw.org
http://zhongguo.snjrw.org
http://yinyue.snjrw.org
http://yonghu.snjrw.org
http://tuiguang.snjrw.org
http://gouwu.snjrw.org
http://baocun.snjrw.org
http://fenxiang.snjrw.org
http://fenxi.snjrw.org
http://gongneng.snjrw.org
http://wangguan.snjrw.org
http://zixun.snjrw.org
http://dianzi.snjrw.org
http://tupian.snjrw.org
http://wangyou.snjrw.org
http://chajian.snjrw.org
http://wuliu.snjrw.org
http://mima.snjrw.org
http://liuliang.snjrw.org
http://zhuce.snjrw.org
http://zhengce.snjrw.org
http://peizhi.snjrw.org
http://shipin.snjrw.org
http://jichu.snjrw.org
http://tongji.snjrw.org
http://kuaidi.snjrw.org
http://yingyong.snjrw.org
http://sousuo.snjrw.org
http://jiankong.snjrw.org
http://neirong.snjrw.org
http://gongju.snjrw.org
http://tuisong.snjrw.org
http://shangcheng.snjrw.org
http://anli.snjrw.org
http://dianhua.snjrw.org
http://fuwu.snjrw.org