zoukankan      html  css  js  c++  java
  • 【转】面试题:实现一个队列,这个队列除了有EnQueue, DeQueue操作,还有一个Max操作,三个操作复杂度都是O(1)

    1.每次  新元素进栈的时候,栈里面的元素需要排序

    2.让最小的或者最大的元素位于栈顶,这样就可以在O(1)时间内获得最小或者最大的值了,

    ------

    3.上面的想法  不能保证,进栈(进了队列)之后 ,出去的元素的顺序,因此只有一个栈是不行的

    4.要有个保存最小或者最大的元素,每次进栈的时候,跟这个数比较,存起来,

    ---------------

    5.但是有个问题,就是你最大的元素(或者最小的元素出去)了之后,你该怎么去更新这个值呢,

    6.就是只  维持一个变量是不够的

    7.最小元素或者最大元素出栈之后,要能够保证次小元素立马填补现在这个位置

    --------

    也就是说,我们需要把次小元素和最小元素都保存起来,放到另外的一个辅助栈里面,

    --------------

    举例子

     1.  进栈3  数据是3     辅助栈3               最小值3

    2.    进栈4  数据是3,4    辅助栈是3,3     最小值3

    3.   进栈2     数据是3,4,2    辅助栈3,3,2    最小值2

    4.  进栈1  数据是3,4,2,1    辅助栈3,3,2,1     最小值1

    5.  弹出   数据是3,4,2     辅助栈是3,3,2    最小值是2

    6      弹出   数据是3,4,     辅助栈是3,3,        最小值是3

    7  进栈0     数据是3,4,0          辅助栈是3,3,0        最小值0

    每次把最小的栈压入辅助栈,就能保证栈顶的辅助元素一直是最小的数

    问题就是  当我弹出的时候,辅助栈也要跟着弹出一个数才可以

    代码就是:

    1.进栈

         数据   value  进入数据栈,

        判断辅助栈

         如果辅助栈为空,或者辅助栈的栈顶元素比  value大,就把value压如辅助栈,

        否则就把  辅助栈的栈顶元素  重复压入  辅助栈里面

      //要保证  数据栈和辅助栈的元素个数一致

    2.弹出

      数据栈不能为空,辅助栈也不能为空

      数据栈弹出

          辅助栈弹出

    3.求最大值或者最小值

          数据栈不能为空,辅助栈也不能为空,

         直接返回  辅助栈的top元素

  • 相关阅读:
    HDU1443_Joseph_约瑟环
    HDU1568_求fibonacci的前四位
    HDU3368_翻转棋
    HDU1134_catalan_大数运算
    HDU1032_The 3n+1_数学题
    HDU2674_N!模2009
    HDU2067_小兔的棋盘_catalan_递推
    文件读写操作inputStream转为byte[] , 将InputStream写入本地文件
    JVM堆内存调优
    Java使用 POI 操作Excel
  • 原文地址:https://www.cnblogs.com/wust221/p/5396263.html
Copyright © 2011-2022 走看看