【转】面试题:实现一个队列,这个队列除了有EnQueue, DeQueue操做,还有一个Max操做,三个操做复杂度都是O(1)

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

2.让最小的或者最大的元素位于栈顶,这样就能够在O(1)时间内得到最小或者最大的值了,队列

 

------变量

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

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

---------------时间

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元素

相关文章
相关标签/搜索