簡單介紹python的雙向隊列


介紹

  大家都知道利用 .append 和 .pop 方法,我們可以把列表當作棧或者隊列來用(比如,把 append 和 pop(0) 合起來用,就能模擬棧的“先進先出”的特點)。但是刪除列表的第一個元素(抑或是在第一個元素之前添加一個 元素)之類的操作是很耗時的,因為這些操作會牽扯到移動列表里的所有元素。這個時候雙向隊列就又作用了。

deque 是什么

  collections.deque 類(雙向隊列)是一個線程安全、可以快速從兩端添加或者刪除元素的數據類型。而且如果想要有一種數據類型來存 放“最近用到的幾個元素”,deque 也是一個很好的選擇。這是因為在新建一個雙向隊列的時候,你可以指定這個隊列的大小,如果這個隊列滿員了,還可以從反向端刪除過期的元素,然后在尾端添加新的元素。

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

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

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

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

1.正向旋轉(循環)

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

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

2.反向旋轉(逆時針)

#反向旋轉
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 可以在多線程程序 中安全地當作先進先出的棧使用,而使用者不需要擔心資源鎖的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM