Featured image of post 【Leetcode】python - [232] Implement Queue using Stacks 個人筆記

【Leetcode】python - [232] Implement Queue using Stacks 個人筆記

整理 LeetCode #232 — linked list、演算法分析、解。

題目出處

232. Implement Queue using Stacks

難度

easy

題目分類

Stack, Design, Queue

2022-03-09 一刷

個人筆記

這篇比較偏程式架構設計,我專注在分析答案,就不特別解。

算法說明

兩個 Stack 可以拼出一個 Queue」,
對於這個問題我們可以這樣想,
Stack 作為 FILO 的資料結構,先進入的資料會放在底層
而當有兩個 Stack,FILO,再一次 FILO (此時位於底層的資料,就會被拿上來到頂層),
總合起來就會得到 FIFO 了!

研究別人的解法

這裡我研究的解法是:Share my python solution (32ms)

class MyQueue:
    def __init__(self):
        self.inStack = []
        self.outStack = []

    def push(self, x):
        while self.outStack:
            self.inStack.append(self.outStack.pop())
        self.outStack.append(x)
        while self.inStack:
            self.outStack.append(self.inStack.pop())

    def pop(self):
        return self.outStack.pop()

    def peek(self):
        return self.outStack[-1]

    def empty(self):
        return (not self.outStack and not self.inStack)


# Your MyQueue object will be instantiated and called as such
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()

初始化就是兩個 Stack,分成 in, out 兩組,
「記得我們的大概念就是要兩個 FILO + FILO = FIFO」

  • init:初始化兩組 inStack, outStack
  • push:放一個資料進入 inStack
  • pop:從 outStack 拿出一筆資料,在這之前應該會需要經過把 inStack 的資料全部以 FILO 放入 outStack
  • peek:與 pop 類似,但 pop 會需要回傳並刪除 Queue 中的內容,而 peek 只是我們想看看即將被 pop 的項目是什麼,而不做 pop 的動作。
  • empty:我們需要同時檢查 inStack, outStack 是否為空

移動過程:作為移動 inStack 的資料內容至 outStack 的內容使用,這裡有個重點「outStack此時必須為空」,因為我們可以將每次的 move 視為一組,而當這組的 Queue 順序順利清空前,「不能」再放新資料進去,否則會造成順序錯誤。

圖例

下圖我們做的步驟是

  • 先放入 123
  • 準備拿出 123,但沒一次全拿
  • 放入 456
  • 準備繼續拿出數字,這時我們會發現不能先移動 456,順序會亂掉, 需要等待前一組「123」全部都移除完才能夠進行再次移動下一組的動作。
  • 【Leetcode】python - [232] Implement Queue using Stacks 個人筆記

    Reference

    Licensed under CC BY-NC-SA 4.0
    最後更新 Mar 09, 2022
    使用 Hugo 建立
    主題 StackJimmy 設計