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 == []
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章