1. 程式人生 > >棧和隊列問題:設計一個有 getMin 功能的棧

棧和隊列問題:設計一個有 getMin 功能的棧

filo 基礎上 push 沒有 一個棧 最小值 sta 返回 fir

知識點

  棧是一個先進後出(FILO-First In Last Out)的數據結構,隊列是一種先進先出(FIFO-First In First Out)的數據結構。

題目

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

要求

  1. pop、push、getMin 操作的時間復雜度都是 O(1)。
  2. 設計的棧類型可以使用現成的棧結構。

難度

  一星

解答

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

  方案1:

  • 壓入數據規則(push)

  假設當前數據為 newNum, 先將其壓入 stackData。然後判斷 stackMin 是否為空:

  1). 如果為空, 則 newNum 也壓入 stackMin。

  2). 如果不為空,則比較 newNum 和 stackMin 的棧頂元素哪一個更小:如果 newNum 更小或兩者相等,則 newNum 也壓入 stackMin; 如果 stackMin 的棧頂元素更小,則 stackMin 不壓入任何內容。這樣處理的結果,則是 stackMin 的棧頂元素一定為 stackMin 中的最小值。

  • 彈出數據規則(pop)

  先在 stackData 中彈出棧頂元素,記為 value。然後比較當前 stackMin 的棧頂元素和 value, 從上面壓入數據規則知道,stackMin 的棧頂元素一定為 stackMin 中的最小值,所以value 一定大於等於 stackMin 棧頂元素。當 value 等於 stackMin 的棧頂元素時,stackMin 彈出棧頂元素;當 value 大於 stackMin 的棧頂元素, stackMin 不彈出任何元素。結果返回 value。

  • 查詢當前棧中的最小值(getMin)

  根據上述壓入規則可知,該結果應該返回 stackMin 的棧頂元素.

棧和隊列問題:設計一個有 getMin 功能的棧