隊列
先進先出(FIFO)
棧
後進先出(LIFO)
雙棧實現隊列
如何用兩個棧,僅使用棧的基本操作實現隊列。
思路:
1. 進隊列操作使用stack2, 當enqueue數據時,直接把數據push到stack2.
2. 出隊列操作使用stack1, 當dequeue數據時, 首先判斷stack1是否爲空,如果不爲空,則從stack1 pop數據返回。如果stack1爲空,則依次把stack2的數據全部pop出來,並push到stack1, 使用stack1 pop數據返回。
源碼參考實現
class QueueTwoStack(object):
'''使用雙棧實現隊列'''
def __init__(self):
self.__stack1 = LinkStack()
self.__stack2 = LinkStack()
def enqueue(self, v):
self.__stack2.push(v)
def dequeue(self):
if self.__stack1.isEmpty():
while not self.__stack2.isEmpty():
self.__stack1.push(self.__stack2.pop())
return self.__stack1.pop()
def peek(self):
if self.__stack1.isEmpty():
while not self.__stack2.isEmpty():
self.__stack1.push(self.__stack2.pop())
return self.__stack1.peek()
def isEmpty(self):
return self.__stack1.isEmpty() and self.__stack2.isEmpty()
def size(self):
return self.__stack1.size() + self.__stack2.size()