Day 10| 232.用栈实现队列 、 225. 用队列实现栈
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
浙公网安备 33010602011771号