6. 隊列(1)

  1. 隊列python

隊列和常說的排隊差很少,先來的人先走,後面來的人接着走,最後來的人最後走數據結構

image.png

結構:FIFO
app

棧和隊列是相反的,先進後出,後進先出的結構ide

隊列不是憑空實現的一個結構,還要用以前已經實現過的數據結構來實現單元測試


以前學習的結構:學習

    array,list,linkedlist,dll測試


2. 實現隊列的ADT須要有兩個基本操做:spa

push(入隊)blog

pop(出隊)隊列

用列表實現:

好比說他是一個固定的列表,向前插入元素的話,這樣它的時間複雜度比較高,由於他要把後面入隊的元素往列表後面移動,方便出隊,因此選擇列表不合適。

image.png


用單鏈表實現:

入隊實際上等於往root節點後面插入O(n),出隊其實是把最後一個節點刪除,效率不高

image.png


以前實現過單鏈表,包含append和remove操做等等,這裏選用單鏈表實現隊列的話,會發現有一個popleft方法和append方法,這裏兩個方法的時間複雜度都是O(1),這樣就能方面的用單鏈表實現隊列了。

image.png



用雙鏈表實現:

也一樣支持這兩個方法操做實現的,可是雙鏈表更復雜,因此這裏用單鏈表來實現隊列。



代碼實現:

class Queue(object):
    def __init__(self, maxsize=None):
        self.maxsize = maxsize                      #默認爲空,能夠push元素到裏面
        self._item_linked_list = LinkedList()       #實例化以前的構造的單鏈表

    def __len__(self):
        return len(self._item_linked_list)

    def push(self, value):                          #入隊
        if self.maxsize is not None \
            and len(self) >= self.maxsize:          #判斷鏈表滿了的狀況
            raise Exception('Queue is Full')
        return self._item_linked_list.append(value) #不然添加元素

    def pop(self):
        if len(self) <= 0:
            raise Exception('Queue is empty')
        return self._item_linked_list.popleft()


#單元測試
def test_queue():
    q = Queue()
    q.push(0)
    q.push(1)
    q.push(2)
    assert len(q) == 3
    assert q.pop() == 0
    assert q.pop() == 1
    assert q.pop() == 2


使用when-Changed的命令監控測試:

安裝使用說明:https://pypi.org/project/when-changed/0.2.1/#description


# when-changed -v -r -1 -S ./  'py.test -s queue.py'

這樣就能動態監測代碼執行了。

相關文章
相關標籤/搜索