队列
先进先出(FIFO)
栈
后进先出(LIFO)
双队列实现栈
如何用两个队列,仅使用队列的基本操作实现栈。
思路:
1. 进栈操作作使用queue2, 当push数据时,直接把数据enqueue到queue2.
2. 出栈操作时, 依次从queue2中取出一个元素,然后判断此时queue2是否为空,如果不为空则把当前元素enqueue进队列queue1,如果为空,则表示当前元素是最后一个进入队列的元素,则把当前元素返回。
3. 交换queue2和queue1。
效率
可见用双队列实现栈操作,pop操作效率很低,每次pop操作的时间复杂度为O(N),需要把队列中的所有元素全部搬运一遍。
源码参考实现
class StackTwoQueue(object):
'''使用双队列实现栈'''
def __init__(self):
self.__q1 = LinkQueue()
self.__q2 = LinkQueue()
def push(self, v):
self.__q2.enqueue(v)
def pop(self):
while True:
x = self.__q2.dequeue()
if self.__q2.isEmpty():
self.__q1, self.__q2 = self.__q2, self.__q1
return x
else:
self.__q1.enqueue(x)
def peek(self):
while True:
x = self.__q2.dequeue()
self.__q1.enqueue(x)
if self.__q2.isEmpty():
self.__q1, self.__q2 = self.__q2, self.__q1
return x
def isEmpty(self):
return self.__q2.isEmpty()
def size(self):
return self.__q2.size()