队列实现栈
思路
假设我们有队列A和队列B,如何实现一个栈呢?
也就是说,给我们两个队列,依次push 1 2 3 4,如下图,如何让弹出的顺序是 4 3 2 1呢?
思路很简单,如下图,我们把队列A中的前(n-1)个元素pop,并push到队列B中,再弹出队列A中的元素。
然后,交换队列A和B,继续进行上述操作,直至两个队列均为空。
代码实现
# 栈实现队列
class Stack:
def __init__(self):
self.queueA = []
self.queueB = []
def push(self, elem):
self.queueA.append(elem)
def pop(self):
while (len(self.queueA) > 1):
self.queueB.append(self.queueA.pop(0))
res = self.queueA.pop(0)
self.queueA, self.queueB = self.queueB, self.queueA
return res
if __name__ == '__main__':
s = Stack()
s.push(1)
s.push(2)
print(s.pop())
s.push(3)
print(s.pop())
print(s.pop())
栈实现队列
思路
假设我们有栈A和栈B,如何实现一个队列呢?
也就是说,给我们两个栈,依次push 1 2 3 4,如下图,如何让弹出的顺序是 1 2 3 4呢?
思路也很简单,栈具有先进后出的特性,两个栈实现队列,正是用了“负负得正”的原理。
如下图,先把栈A中的元素依次push到栈B中,然后再从栈B中依次读取出 1 2 3 4。
需要注意的是,当栈B不为空时,从栈B中pop元素;当栈B为空时,将栈A中的元素push到栈B中,再从栈B中pop。
代码实现
class Queue:
def __init__(self):
self.stackA = []
self.stackB = []
def push(self, elem):
self.stackA.append(elem)
def pop(self):
while (len(self.stackB) > 0):
return self.stackB.pop(-1)
while (len(self.stackA) > 0):
self.stackB.append(self.stackA.pop(-1))
return self.stackB.pop(-1)
if __name__ == '__main__':
q = Queue()
q.push(1)
q.push(2)
print(q.pop())
q.push(3)
print(q.pop())
print(q.pop())