Python程式設計題33--用棧實現佇列
阿新 • • 發佈:2021-11-28
題目
棧和佇列是常見的資料結構,棧的特點是 先進後出
,而佇列的特點是 先進先出
。
請使用 棧 模擬實現佇列的下列操作:
- 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
作者:wintest 出處:https://www.cnblogs.com/wintest 本文版權歸作者和部落格園共有,歡迎轉載,但必須在文章頁面明顯位置給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。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 == []