目录
232.用栈实现队列
思路
话说晚上看题目真的需要精力,昨天晚上迷迷糊糊的看着道题目,觉得好难,根本看不懂在讲什么,然后直接放弃看题目睡觉去了,今天白天又重温一遍,感觉so easy。好了,回归正题,python里面没有内置的栈数据结构,所以可以使用列表来模拟栈操作。
但是栈的特性是先进后出,而队列的特性是先进先出,so,这该咋办?一个不行,咱们就上俩呗。
一个输入栈,一个输出栈。当向队列里面push数据的时候,放在输入栈stack_in里。需要拿数据的时候从输出栈stack_out里面pop()数据即可,以下为两个栈工作过程
方法一:用两个栈实现队列
class MyQueue:
def __init__(self) -> None:
# 用来存放入栈数据
self.stack_in = []
# 用来存放出站数据
self.stack_out = []
# 将一个元素放入队列的尾部
def push(self,x:int) ->None:
self.stack_in.append(x)
def pop(self) -> None:
if not self.empty():
return
if self.stack_out:
return self.stack_out.pop()
else:
for i in range(len(self.stack_in)):
self.stack_out.append(self.stack_out.pop())
return self.stack_out.pop()
# 返回队列首部的元素
def peek(self) -> None:
head = self.pop()
if head:
self.stack_out.append(head)
return head
else:
return
def empty(self) -> None:
# 如果进栈和出栈元素都为空,队列为空
return not(self.stack_in or self.stack_out )
心得收获
摘自代码随想录:
在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。
最后如何判断队列为空呢?如果进栈和出栈都为空的话,说明模拟的队列为空了。
在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。
最后如何判断队列为空呢?如果进栈和出栈都为空的话,说明模拟的队列为空了。