題目出處
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
![Featured image of post 【Leetcode】python - [232] Implement Queue using Stacks 個人筆記](/images/restored/2022/03/img_0271.jpg)
![【Leetcode】python - [232] Implement Queue using Stacks 個人筆記](/images/restored/2022/03/img_0271.webp)