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