Python中的雙端佇列


雙端佇列基本上是棧和佇列結構的泛化,它從左到右初始化。它使用列表物件來建立雙端佇列。它為彈出和追加提供了 O(1) 的時間複雜度。

Deque 是一個標準庫類,位於 **collections** 模組中。

要使用它,首先我們需要匯入 collections 標準庫模組。

import collections

在本節中,我們將瞭解 Deque 類的某些函式。

Deque 上的追加函式

有兩種不同的追加型別。append() 方法用於在佇列的右端新增元素,appendleft() 方法用於在佇列的左側追加元素。

示例程式碼

import collections as col
#Insert some elements into the queue at first
my_deque = col.deque('124dfre')
   print('Dequeue: ' + str(my_deque))
      #insert x at right and B at left
      my_deque.append('x')
      my_deque.appendleft('B')
   print('Dequeue after appending: ' + str(my_deque))

輸出

Dequeue: deque(['1', '2', '4', 'd', 'f', 'r', 'e'])
Dequeue after appending: deque(['B', '1', '2', '4', 'd', 'f', 'r', 'e', 'x'])

Deque 上的彈出函式

與追加類似,有兩種不同的彈出函式型別。pop() 方法用於從佇列中刪除並返回最右邊的元素,popleft() 方法用於刪除並返回佇列中最左邊的元素。

示例程式碼

import collections as col
#Insert some elements into the queue at first
my_deque = col.deque('124dfre')
   print('Dequeue: ' + str(my_deque))
      #delete item from right and left
      item = my_deque.pop()
   print('Popped Item: ' + str(item))
      item = my_deque.popleft()
   print('Popped Item: ' + str(item))
print('Dequeue after pop operations: ' + str(my_deque))

輸出

Dequeue: deque(['1', '2', '4', 'd', 'f', 'r', 'e'])
Popped Item: e
Popped Item: 1
Dequeue after pop operations: deque(['2', '4', 'd', 'f', 'r'])

Deque 中與專案相關的函式

Deque 中的一些函式用於獲取與專案相關的資訊。有一些函式,例如 index()、count() 等。index 方法用於獲取元素第一次出現的索引。當沒有為元素傳遞引數時,它將選擇整個列表,當指定了某個限制時,它將在該限制內檢查索引。另一方面,count() 方法計算 Deque 中專案的頻率。

示例程式碼

import collections as col
#Insert some elements into the queue at first
my_deque = col.deque('AABCDDEFD')
   print('Dequeue: ' + str(my_deque))
      #find the index of D
   print('Index of D:' + str(my_deque.index('D')))
print('Index of D in range 5 to 8 is: ' + str(my_deque.index('D', 5, 8)))
#Count the number of occurrences
   print('Occurrences of A: ' + str(my_deque.count('A')))
print('Occurrences of D: ' + str(my_deque.count('D')))

輸出

Dequeue: deque(['A', 'A', 'B', 'C', 'D', 'D', 'E', 'F', 'D'])
Index of D:4
Index of D in range 5 to 8 is: 5
Occurrences of A: 2
Occurrences of D: 3

Deque 中的 insert() 和 remove() 函式

我們已經看到了 Deque 中用於分別插入和刪除元素的 append 和 pop 函式。還有另外兩種與插入和刪除相關的函式。insert() 方法用於插入一個數字。在這種情況下,我們可以提供插入的索引。因此,可以在指定位置插入專案。remove() 方法用於刪除元素的第一次出現。

示例程式碼

import collections as col
#Insert some elements into the queue at first
my_deque = col.deque('AABCDDEFD')
print('Dequeue: ' + str(my_deque))
#Insert letter G and H into the position 5, 7 respectively
my_deque.insert(5, 'G')
my_deque.insert(7, 'H')
print('Dequeue after inserting: ' + str(my_deque))
#Delete first occurrence of letter D
my_deque.remove('D')
print('Dequeue after removing: ' + str(my_deque))

輸出

Dequeue: deque(['A', 'A', 'B', 'C', 'D', 'D', 'E', 'F', 'D'])
Dequeue after inserting: deque(['A', 'A', 'B', 'C', 'D', 'G', 'D', 'H', 'E', 'F', 'D'])
Dequeue after removing: deque(['A', 'A', 'B', 'C', 'G', 'D', 'H', 'E', 'F', 'D'])

Deque 中的擴充套件函式

擴充套件函式用於將多個元素新增到 Deque 中。我們可以使用列表、元組等集合來提供多個值。有兩種型別的擴充套件函式。extend() 方法用於將元素新增到右側,它類似於重複的 append() 函式。extendleft() 方法用於將元素新增到左側,它類似於重複的 appendleft() 函式。

示例程式碼

import collections as col
#Insert some elements into the queue at first
my_deque = col.deque('AABCDDEFD')
print('Dequeue: ' + str(my_deque))
#Extend by adding 1, 3, 5, 7 to the right and x, y, z to the left
my_deque.extend([1, 3, 5, 7])
my_deque.extendleft(['x', 'y', 'z'])
print('Dequeue after Extending: ' + str(my_deque))

輸出

Dequeue: deque(['A', 'A', 'B', 'C', 'D', 'D', 'E', 'F', 'D'])
Dequeue after Extending: deque(['z', 'y', 'x', 'A', 'A', 'B', 'C', 'D', 'D', 'E', 'F', 'D', 1, 3, 5, 7])

Deque 中的反轉和旋轉函式

我們可以使用 reverse() 方法反轉雙端佇列的順序。還有另一種稱為 rotate() 的方法。使用 rotate 方法,可以根據作為引數指定的數字旋轉雙端佇列。如果引數為正數,則向右旋轉,對於負數,則向左旋轉。

示例程式碼

import collections as col
#Insert some elements into the queue at first
my_deque = col.deque('AABCDDEFD')
print('Dequeue: ' + str(my_deque))
my_deque.reverse()
print('Deque after Reversing:' + str(my_deque))
#rotate to the right, 3 elements
my_deque.rotate(3)
print('Deque after rotating:' + str(my_deque))

輸出

Dequeue: deque(['A', 'A', 'B', 'C', 'D', 'D', 'E', 'F', 'D'])
Deque after Reversing:deque(['D', 'F', 'E', 'D', 'D', 'C', 'B', 'A', 'A'])
Deque after rotating:deque(['B', 'A', 'A', 'D', 'F', 'E', 'D', 'D', 'C'])

更新於: 2020年6月26日

7K+ 閱讀量

開啟您的 職業生涯

完成課程獲得認證

立即開始
廣告
© . All rights reserved.