Day 10| 232.用棧實現佇列 、 225. 用佇列實現棧

forrestr發表於2024-06-01

232.用棧實現佇列

大家可以先看影片,瞭解一下模擬的過程,然後寫程式碼會輕鬆很多。

題目連結/文章講解/影片講解:https://programmercarl.com/0232.用棧實現佇列.html

思考

兩個棧,棧1用於入佇列,棧2用於出佇列,棧2為空時,如果要出佇列,把棧1的元素逐個彈出到棧2,保證棧2的頂部,永遠時最早入隊的元素。

class MyQueue:

    def __init__(self):
        self.stack1 = []
        self.stack2 = []
    def push(self, x: int) -> None:
        self.stack1.append(x)

    def pop(self) -> int:
        if self.stack2:
            return self.stack2.pop()
        else:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
            return self.stack2.pop()

    def peek(self) -> int:
        if self.stack2:
            return self.stack2[-1]
        else:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
            return self.stack2[-1]    

    def empty(self) -> bool:
        return self.stack1 == [] and self.stack2 == []

225. 用佇列實現棧 - [ ]

可以大家慣性思維,以為還要兩個佇列來模擬棧,其實只用一個佇列就可以模擬棧了。

建議大家掌握一個佇列的方法,更簡單一些,可以先看影片講解

題目連結/文章講解/影片講解:https://programmercarl.com/0225.用佇列實現棧.html

思考

1、兩個佇列實現棧,佇列1入棧,佇列2臨時儲存佇列1出隊的元素。每出棧一次,佇列1和佇列2互換,有元素的當佇列1,好理解一點。
2、python用deque (雙端佇列)

from collections import deque
class MyStack:

    def __init__(self):
        self.deque1 = deque()
        self.deque2 = deque()

    def push(self, x: int) -> None:
        self.deque1.append(x)

    def pop(self) -> int:
        if len(self.deque1) == 0:
            self.deque1,self.deque2 = self.deque2,self.deque1
        size = len(self.deque1)
        while size-1:
            self.deque2.append(self.deque1.popleft())
            size-=1
        return self.deque1.popleft()

    def top(self) -> int:
        res = self.pop()
        if len(self.deque1) == 0:
            self.deque1,self.deque2 = self.deque2,self.deque1 
            self.deque1.append(res)
        return res

    def empty(self) -> bool:
        return len(self.deque1) ==0 and len(self.deque2) ==0

進階

用1個佇列實現棧。從上面的程式碼可以看到,佇列操作的元素順序沒有發生變化。可以用一個佇列實現棧,想想一下有個排隊的佇列,出棧時是需要出隊尾元素的,假設佇列長度為n,這時把前n-1個元素逐個出隊再入隊。相當於本來排前面的人,仍然按照順序站在最後一個人的後面排隊。隊尾的人自然成為第一個人,pop出去。

from collections import deque
class MyStack:

    def __init__(self):
        self.deque1 = deque()

    def push(self, x: int) -> None:
        self.deque1.append(x)

    def pop(self) -> int:
        size = len(self.deque1)
        while size-1:
            self.deque1.append(self.deque1.popleft())
            size-=1
        return self.deque1.popleft()

    def top(self) -> int:
        res = self.pop()
        self.deque1.append(res)
        return res

    def empty(self) -> bool:
        return len(self.deque1) ==0 

相關文章