思路:
注意事项:
题目要求用2个栈实现一个队列,而不是一个列表实现队列,python中用list代替栈,只不过这个list根据题目要求只能用标准的栈操作,即append元素到栈顶,从栈顶pop出元素
思路: 队列是先进先出,栈是先进后出, 要求用两个栈
第一步. 先把 1 2 3按顺序放进第一个栈,stack = [1, 2, 3]
第二步. 然后把第一个栈的所有值放到第二个栈,根据先进后出,从第一个栈拿的顺序是3 2 1,所以放进第二个栈的顺序是3 2 1,stack2 = [3, 2, 1]
第三步. 从第二个栈拿数据,根据先进后出,取的顺序是1 2 3,
从而实现按照 1 2 3顺序放入MyQueue, 以 1 2 3的顺序从MyQueue取出
————————————————————————————————————————
class MyQueue:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, x: int) -> None:
"""将元素 x 推到队列的末尾"""
# 第一步 stack1 = [1, 2, 3]
self.stack1.append(x)
def pop(self) -> int:
"""从队列的开头移除并返回元素"""
# 如果stack2有,那就先返回stack2的,
# 这里是防止,多次pop没pop完,这个时候push了一个值,如果直接走到下边while,会将这个值放到stack2,会先把这个值pop出去
if self.stack2:
return self.stack2.pop()
# 第二步 把第一个栈的所有值放到第二个栈,从第一个栈拿的顺序是3 2 1,所以放进第二个栈的顺序是3 2 1,
# stack2 = [3, 2, 1]
while len(self.stack1) > 0:
item = self.stack1.pop()
self.stack2.append(item)
# 第三步 从第二个栈取的顺序是1 2 3
# 由于pop只返回一个,那就只pop一次,pop取出的是[3, 2, 1]中的最后一个值1 实现了队列的先进先出
return self.stack2.pop()
def peek(self) -> int:
"""返回队列开头的元素,不pop"""
# if self.stack2:
# # 这里是-1 原因是拿队列开头的元素,就是stack2=[3, 2, 1]中最后一个元素
# return self.stack2[-1]
# elif self.stack1:
# # 这里是0 原因是 走到这里肯定stack2是空的,那应该stack1刚push进来一些值,stack1=[4,5,6],push顺序是456所以要拿[0]号索引
# return self.stack1[0]
# else:
# return None
# 上面的方法也行 但是比较麻烦,可以先pop然后再给stack2补一个
# 为什么给stack2补:根据实现的pop方法,给stack2加一个 下次queue.pop的时候优先会推出刚插进来的这个值
item = self.pop()
self.stack2.append(item)
return item
def empty(self) -> bool:
# 两个栈都是空,队列就是空
return not self.stack1 and not self.stack2
# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()