题目链接/文章讲解/视频讲解:https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
用栈实现队列,要搞清楚栈和队列的区别,栈是先进后出,队列是先进先出,所以达到目的的话要使用两个栈,最终实现队列的目的。
class MyQueue:
def __init__(self):
"""
in主要负责push,out主要负责pop
"""
self.stack_in = []
self.stack_out = []
def push(self, x: int) -> None:
"""
有新元素进来,就往in里面push
"""
self.stack_in.append(x)
def pop(self) -> int:
"""
Removes the element from in front of queue and returns that element.
"""
if self.empty():
return None
if self.stack_out:
return self.stack_out.pop()
else:
for i in range(len(self.stack_in)):
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self) -> int:
"""
Get the front element.
"""
ans = self.pop()
self.stack_out.append(ans)
return ans
def empty(self) -> bool:
"""
只要in或者out有元素,说明队列不为空
"""
return not (self.stack_in or self.stack_out)
这里着重理解一下pop函数里面的判断关系:
if self.stack_out:
- 若
self.stack_out非空:栈顶元素即队列头部元素,可直接弹出。 - 若
self.stack_out为空:需将self.stack_in的所有元素倒入self.stack_out(逆序),使队首元素位于self.stack_out栈顶
假设队列操作为 push(1) -> push(2) -> push(3) -> pop() -> pop():
- 初始状态:
stack_in = [],stack_out = []
- 三次
push后:stack_in = [1, 2, 3](1是队首)stack_out = []
- 第一次
pop():if self.stack_out为False→ 执行else,将stack_in倒入stack_out:stack_in = [],stack_out = [3, 2, 1](栈顶1是队首)
- 弹出
stack_out的1并返回。
- 第二次
pop():if self.stack_out为True(此时stack_out = [3, 2])。- 直接弹出
2并返回。
494

被折叠的 条评论
为什么被折叠?



