雙隊列=>棧

隊列

先進先出(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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章