题目
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
代码
class Solution:
def __init__(self):
self.stackA=[]
self.stackB=[]
def push(self,elem):
if self.stackA==[]:
for i in range(len(self.stackB)):
self.stackA.append(self.stackB.pop())
self.stackA.append(elem)
else:
self.stackA.append(elem)
def pop(self):
if self.stackA==[]:
if not self.stackB==[]:
return self.stackB.pop()
else:
for i in range(len(self.stackA)):
self.stackB.append(self.stackA.pop())
return self.stackB.pop()
思路
1、栈其实可以用python中的列表list表示,栈是“先进后出”的类型,类似摞碗与取碗。
2、队列是“先进先出的类型”,类似于排队服务。
这里用两个栈来实现队列,那么,可以建立两个空栈,第一个用来最为记录队列的主要栈
首先,队列的push,即增加元素,那么可以直接在stackA里面添加
其次,队列的pop,因为如果直接用listname.pop()的话默认删除最后一个元素,队列应该是删除第一个元素,那么这里需要把栈A中的元素一个一个取出push到栈B里面,这时候栈顶的元素就是队列第一个元素。
非常注意的点
1、这里看似push很简单,但是,如果经历了一次pop之后,那么栈A就是空的了,这时如果直接把元素push到栈A中就是错的。需要先把栈B中的元素一个一个取出重新push到栈A中,然后再push新元素。
2、对于pop,看似如果栈A为空时,没必要执行pop,所以我刚开始就写的pass。但是,要注意一点,如果经历了一次pop,这是栈A为空,因为栈A的元素全部转移到栈B中去了,所以如果栈B中还有元素那么可以继续pop。具体做法就是,直接从栈B中pop就好了,没必要倒腾回去。