【轉】面試題:實現一個隊列,這個隊列除了有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元素

相關文章
相關標籤/搜索