簡單介紹python的雙向隊列

介紹

  你們都知道利用 .append 和 .pop 方法,咱們能夠把列表看成棧或者隊列來用(好比,把 append 和 pop(0) 合起來用,就能模擬棧的「先進先出」的特色)。可是刪除列表的第一個元素(抑或是在第一個元素以前添加一個 元素)之類的操做是很耗時的,由於這些操做會牽扯到移動列表裏的全部元素。這個時候雙向隊列就又做用了。安全

deque 是什麼

  collections.deque 類(雙向隊列)是一個線程安全、能夠快速從兩端添加或者刪除元素的數據類型。並且若是想要有一種數據類型來存 放「最近用到的幾個元素」,deque 也是一個很好的選擇。這是由於在新建一個雙向隊列的時候,你能夠指定這個隊列的大小,若是這個隊列滿員了,還能夠從反向端刪除過時的元素,而後在尾端添加新的元素。多線程

下面用幾個實例來講明如何使用雙向隊列以及帶來了什麼方便的處理方式。app

一開始咱們須要先初始化一個固定長度的雙向隊列便於咱們實驗。優化

說明:maxlen 是一個可選參數,表明這個隊列能夠容納的元素的數量,不可變。spa

from collections import  deque
#雙向隊列
listdq=deque(range(10),maxlen=10)
print (listdq)

1.正向旋轉(循環)線程

 說明:隊列的旋轉操做接受一個參數 n,當 n > 0 時,隊列的最右邊的 n 個元素會被移動到隊列的左邊。當 n < 0 時,最左邊的 n 個元素會被 移動到右邊。code

#正向旋轉
listdq.rotate(2)
print(listdq)

2.反向旋轉(逆時針)blog

#反向旋轉
listdq.rotate(-2)
print(listdq)

3.附加數據隊列

說明:當試圖對一個已滿(len(d) == d.maxlen)的隊列作尾部添加操做的時候,它頭部的元素會被刪除掉。注意在下一行裏,元素 0 被刪除 了。資源

 
 
#附加數據
listdq.appendleft(-1)
print(listdq)
listdq.append(10)
print(listdq)
 

4.擴展數據

說明:extendleft(iter) 方法會把迭代器裏的元素逐個添加到雙向隊列的左邊,所以迭代器裏的元素會逆序出如今隊列裏。注意是逆序。

#擴展數據
listdq.extendleft([20,30,40])
print(listdq)
listdq.extend([50])
print(listdq)

以上代碼結果以下:

雙向列表和隊列的方法介紹:

 

總結:

本篇總結了列表和雙向隊列這兩個類型的方法(object 類包含的方 法除外)。雙向隊列實現了大部分列表所擁有的方法,也有一些額外的符合自身設 計的方法,好比說 popleft 和 rotate。可是爲了實現這些方法,雙向 隊列也付出了一些代價,從隊列中間刪除元素的操做會慢一些,由於它 只對在頭尾的操做進行了優化。append 和 popleft 都是原子操做,也就說是 deque 能夠在多線程程序 中安全地看成先進先出的棧使用,而使用者不須要擔憂資源鎖的問題。

相關文章
相關標籤/搜索