Python編程題32--最小棧

題目

棧是一種常見的數據結構,其特點是 先進後出,也就是說最先放進去的元素,需要到最後才能取出來。

請使用 列表list 實現一個能在 常數時間 內檢索到最小元素的棧,需實現以下操作:

  • push(x) -- 將元素 x 壓入棧頂
  • pop() -- 移除棧頂元素
  • top() -- 獲取棧頂元素
  • min() -- 檢索並返回棧中的最小元素
  • empty() -- 判斷棧是否爲空
  • size() -- 獲取棧的長度

說明:假設每次調用 pop / top / min 操作都能保證棧不爲空。

實現思路1

  • 使用一個棧 s 用於保存每個元素,另外再使用一個棧 min_s 用於保存當前的最小值
  • 每次入棧時,把元素壓入棧 s 的棧頂,同時把棧 s 中的最小值,壓入棧 min_s 的棧頂
  • 每次出棧時,兩個棧都需要執行 pop() 操作
  • 如果要獲取棧頂元素,則直接取棧 s 的棧頂元素;如果要獲取棧中的最小值,則直接取棧 min_s 的棧頂元素

代碼實現1

class MinStack:

    def __init__(self):
        self.s = []
        self.min_s = []

    def push(self, x):
        self.s.append(x)
        if self.min_s == [] or self.min_s[-1] > x:
            self.min_s.append(x)
        else:
            self.min_s.append(self.min_s[-1])

    def pop(self):
        self.s.pop()
        self.min_s.pop()

    def top(self):
        return self.s[-1]

    def min(self):
        return self.min_s[-1]

    def empty(self):
        return self.s == []

    def size(self):
        return len(self.s)

實現思路2

  • 只使用一個棧,同時保存當前值和棧內的最小值
  • 每次入棧時,入棧元素爲元組形式:(最小值,當前值),每次出棧時,把棧頂的元組執行出棧即可
  • 因爲棧頂的元組中同時保存了棧內的最小值和棧頂的當前值,所以棧頂元組中,第一個值即爲棧內最小值,第二個值即爲棧頂當前值

代碼實現2

class MinStack:

    def __init__(self):
        self.s = []

    def push(self, x):
        if self.s == [] or self.s[-1][0] > x:
            self.s.append((x, x))
        else:
            self.s.append((self.s[-1][0], x))

    def pop(self):
        self.s.pop()

    def top(self):
        return self.s[-1][1]

    def min(self):
        return self.s[-1][0]

    def empty(self):
        return self.s == []

    def size(self):
        return len(self.s)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章