1. 程式人生 > 其它 >Python程式設計題33--用棧實現佇列

Python程式設計題33--用棧實現佇列

題目

棧和佇列是常見的資料結構,棧的特點是 先進後出,而佇列的特點是 先進先出

請使用 棧 模擬實現佇列的下列操作:

  • 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 == []
作者:wintest 出處:https://www.cnblogs.com/wintest 本文版權歸作者和部落格園共有,歡迎轉載,但必須在文章頁面明顯位置給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。