题目

  1. 用两个栈来实现一个队列,完成队列的PushPop操作。 队列中的元素为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就好了,没必要倒腾回去。