設計一個有 getMin 功能的棧

weixin_34247155發表於2018-05-07

【 題目 】

實現一特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。

【 要求 】

1 . pep 、 push 、 getMin 操作的時間複雜度都是 O ( 1 ) 。

2 .設計的棧型別可以使用現成的棧結構。

【 解答 】

在設計上我們使用兩個棧,一個棧用來儲存當前棧中的元素,其功能和一個正常的棧沒有區別,這個棧記為 stackData ;另一個棧用於儲存每一步的最小值,這個棧記為 stackMin 。具體的實現方式有兩種。

第一種設計方案如下。

.壓入資料規則。

假設當前資料為 newNum ,先將其壓入 stackdata 。然後判斷 stackMin 是否為空:

· 如果為空,則 n ewN也壓入 atackMin .

· 如果不為空,則比較newNum 和atackMin 的棧頂元素中哪一個更小

· 如果 n ewNum 更小或兩者相等,則 newNum 也壓入 atackMin

· 如果 stackMin 中棧頂元素小,則 stackMin 不壓入任何內容。

舉例:依次壓入 3 、 4 、 5 、 1 、 2 、的過程中, stockdata 和 atackMin 的變化如圖 1 · 1 所示。

11971454-8c23751f288e8291

彈出資料規則

先在 stackData 中彈出棧頂元素,記為 value 。然後比較當前 stackMin 的棧頂元紊和 value 哪一個更小.

通過上文提到的壓入規則可知, stackMin 中存在的元素是從棧底到棧頂逐漸變小的, stackMin 棧頂的元素既是 stackMin 棧的最小值,也是當前 stackData 棧的最小值.所以不會出現value比stackMin 的棧頂元素更小的情況,value只可能大於或等於 staokMin 的棧頂元素。當 value等於 stackMin 的棧頂元素時, stackMin 彈出棧頂元素;

當 value 大於 stackMin 的棧頂元素時, stackMin 不彈出棧頂元素二返回value。

很明顯可以看出,壓入與彈出規則是對應的。

· 查詢當前棧中最小值操作

由於上文的壓入資料規則和彈出資料規則可知, stackMin 始終記錄著 stackdata 中的最小值,所以, stackMin 的棧頂元素始終是當前 stackData 中的最小值。

方案一的程式碼實現如 Mytack1 類所示:

11971454-10f315c7e3369902

第二種方案,小夥伴們可以一起交流一下哦

CSDN社群火爆招募中:https://blog.csdn.net/CSDNedu/article/details/80063505?utm_source=zwqt

相關文章