隊列python
隊列和常說的排隊差很少,先來的人先走,後面來的人接着走,最後來的人最後走數據結構
結構:FIFO
app
棧和隊列是相反的,先進後出,後進先出的結構ide
隊列不是憑空實現的一個結構,還要用以前已經實現過的數據結構來實現單元測試
以前學習的結構:學習
array,list,linkedlist,dll測試
2. 實現隊列的ADT須要有兩個基本操做:spa
push(入隊)blog
pop(出隊)隊列
用列表實現:
好比說他是一個固定的列表,向前插入元素的話,這樣它的時間複雜度比較高,由於他要把後面入隊的元素往列表後面移動,方便出隊,因此選擇列表不合適。
用單鏈表實現:
入隊實際上等於往root節點後面插入O(n),出隊其實是把最後一個節點刪除,效率不高
以前實現過單鏈表,包含append和remove操做等等,這裏選用單鏈表實現隊列的話,會發現有一個popleft方法和append方法,這裏兩個方法的時間複雜度都是O(1),這樣就能方面的用單鏈表實現隊列了。
用雙鏈表實現:
也一樣支持這兩個方法操做實現的,可是雙鏈表更復雜,因此這裏用單鏈表來實現隊列。
代碼實現:
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'
這樣就能動態監測代碼執行了。