编写一个支持 O(1) 时间获取最大值的栈结构。

为了实现一个支持在 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

请使用浏览器的分享功能分享到微信等