隊列
先進先出(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()