題目
棧和隊列是常見的數據結構,棧的特點是 先進後出
,而隊列的特點是 先進先出
。
請使用 棧 模擬實現隊列的下列操作:
- push(x) -- 將元素 x 推到隊列的末尾
- pop() -- 從隊列的開頭移除並返回元素
- peek() -- 返回隊列開頭的元素
- empty() -- 判斷隊列是否爲空
說明:
- 可以用 列表list 來模擬棧,但只允許使用棧的基本操作。
- 假設每次調用 pop 和 peek 都能保證隊列不爲空。
實現思路1
- 使用兩個棧,一個作爲輸入棧 stack1 ,另一個作爲輸出棧 stack2
- 每次 push 入隊操作,直接把 待入隊的新元素 入棧到 stack1 即可
- 每次 pop 出隊操作,stack2的棧頂就相當於隊列的隊頭,直接從 stack2 彈出棧頂元素即可,如果 stack2 爲空,那麼就把 stack1 的所有元素導入到 stack2 中,最後再從 stack2 彈出數據
- 每次 peek 獲取隊頭元素操作,可以複用出隊操作的實現,從而拿到隊列開頭的元素
- 每次 empty 操作,則需判斷 stack1 和 stack2 是否都爲空
代碼實現1
class MyQueue:
def __init__(self):
self.stack1 = [] # 輸入棧
self.stack2 = [] # 輸出棧
def push(self, x):
self.stack1.append(x)
def pop(self):
if self.stack2 == []:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
def peek(self):
tmp = self.pop()
self.stack2.append(tmp)
return tmp
def empty(self):
return self.stack1 == [] and self.stack2 == []
實現思路2
- 使用兩個棧,一個作爲輔助棧 stack1 ,另一個作爲存放隊列元素的棧 stack2
- 每次 push 入隊操作,需先把 stack2 中全部元素導入到 stack1 ,接着把 待入隊的新元素 入棧到 stack1 ,最後把 stack1 中全部元素導入到 stack2,這樣一來,stack2的棧頂就相當於隊列的隊頭
- 每次 pop 出隊操作,直接從 stack2 彈出棧頂元素
- 每次 peek 獲取隊頭元素操作,直接從 stack2 獲取棧頂元素
- 每次 empty 操作,則只需判斷 stack2 是否爲空
代碼實現2
class MyQueue:
def __init__(self):
self.stack1 = [] # 輔助棧
self.stack2 = [] # 存放隊列元素
def push(self, x):
while self.stack2:
self.stack1.append(self.stack2.pop())
self.stack1.append(x)
while self.stack1:
self.stack2.append(self.stack1.pop())
def pop(self):
return self.stack2.pop()
def peek(self):
return self.stack2[-1]
def empty(self):
return self.stack2 == []