Python 中的 Queue.LIFOQueue 與 Collections.Deque 的比較
在這篇文章中,我們將學習 Python 程式語言中 Queue.LIFOQueue 與 Collections.Deque 的區別。當我們需要使用後進先出 (LIFO) 方法管理資料時,可以使用這些資料結構。但是,要選擇其中一個,我們需要了解它們的功能和特性。在此之前,讓我們先了解 Queue.LIFOQueue 和 Collections.Deque。
LIFOQueue
此類是 queue 模組的一部分。它作為一個棧資料結構工作,並且被認為是執行緒安全的,這意味著它可以同時處理不同的執行緒。以下是此類的一些規範。
基於棧 - LIFOQueue 的行為類似於棧資料結構,這意味著最後插入的項將在檢索後首先出現。
執行緒安全 - 使用此類,我們可以應用同步機制並將其用作多執行緒應用程式。
阻塞 I/O 操作 - 在 Queue.LIFOQueue 中,我們可以選擇使用 get() 和 put() 阻塞執行緒。這使得執行緒可以等待直到滿足條件,例如專案可用或佇列為空。
大小 - Queue.LIFOQueue 有一個 size 引數,它限制了佇列的大小並限制了要插入的專案數量。
讓我們來看一個 Queue.LIFOQueue 的示例。
示例
class LifoQueueClass:
def __init__(self):
self.ele = []
def is_empty(self):
return len(self.ele) == 0
def push(self, item):
self.ele.append(item)
def pop(self):
if self.is_empty():
return None
return self.ele.pop()
def size(self):
return len(self.ele)
def display(self):
print("LIFO Queue: ", self.ele)
queueDs = LifoQueueClass()
queueDs.push("Banana")
queueDs.push("Apple")
queueDs.push("Guava")
queueDs.push("Litchi")
print("Updated Queue After inserting items: ")
queueDs.display()
removed_item = queueDs.pop()
print("\nPopped item:", removed_item)
print("Updated Queue After pop: ")
queueDs.display()
print("\nQueue size:", queueDs.size())
if queueDs.is_empty():
print("Queue is empty\n")
else:
print("Queue is not empty\n")
輸出
Updated Queue After inserting items: LIFO Queue: ['Banana', 'Apple', 'Guava', 'Litchi'] Popped item: Litchi Updated Queue After pop: LIFO Queue: ['Banana', 'Apple', 'Guava'] Queue size:3 Queue is not empty
解釋
在這個程式中,我們建立了一個名為 **LifoQueueClass** 的佇列類。在類中,我們有不同的方法,例如 **push** 用於將專案插入佇列,**pop** 用於從佇列中刪除專案,**size** 用於檢查,**is_empty** 用於檢查佇列是否為空,也就是說佇列中沒有剩餘專案。我們建立佇列類的物件,並使用該物件呼叫 push 函式並傳遞我們想要插入的專案。使用 display 函式,我們可以顯示佇列中存在的專案。
Collections.deque
這是一個 Python 中 collection 模組的一部分的類。它作為一個雙端佇列 (deque) 工作,並且具有許多功能,以下是一些規範:
基於雙端佇列 - Collections.deque 的行為類似於雙端佇列資料結構,它支援從兩端插入和刪除操作。它有許多方法,例如 append()、appendLeft() 用於將元素插入到雙端佇列中,以及 pop()、popLeft() 用於從雙端佇列中移除專案。
大小 - 與 LIFOQueue 不同,雙端佇列沒有最大大小引數,它可以根據專案的長度動態增加和減少。
高效 - 雙端佇列為從兩端插入和檢索元素提供了高效的操作,時間複雜度為常數。
讓我們來看一個 Collection.deque 的示例。
示例
from collections import deque
Dqueue = deque()
Dqueue.append("Banana")
Dqueue.append("Apple")
Dqueue.append("Guava")
Dqueue.append("Litchi")
print("Queue:", Dqueue)
ele = Dqueue.popleft()
print("Removed element:", ele)
print("\nUpdated Queue:", Dqueue)
if not Dqueue:
print("Queue is empty.")
else:
print("Queue is not empty.")
Dqueue.append("Mango")
Dqueue.append("Papaya")
print("\nUpdated Queue:", Dqueue)
print("\nQueue size:", len(Dqueue), "\n")
while Dqueue:
ele = Dqueue.popleft()
print("Dequeued element:", ele)
if not Dqueue:
print("Queue is empty.")
else:
print("Queue is not empty.")
輸出
Queue: deque(['Banana', 'Apple', 'Guava', 'Litchi']) Removed element: Banana Updated Queue: deque(['Apple', 'Guava', 'Litchi']) Queue is not empty. Updated Queue: deque(['Apple', 'Guava', 'Litchi', 'Mango', 'Papaya']) Queue size: 5 Dequeued element: Apple Dequeued element: Guava Dequeued element: Litchi Dequeued element: Mango Dequeued element: Papaya Queue is empty.
解釋
在這個程式中,我們使用 deque 建立一個空佇列。為了新增元素,我們使用 append() 方法並傳遞要插入到佇列中的元素。使用 popLeft() 方法,我們從佇列中刪除了專案。然後我們檢查佇列是否為空,並使用 **queue.append("Mango")** 將另外兩個專案新增到佇列中。為了從佇列中移除所有專案,我們使用 while 迴圈並列印正在移除的專案。
因此,我們看到了 Queue.LIFOQueue 和 Collections.Deque 之間的區別。我們瞭解了這兩種資料結構的一些關鍵特性。我們看到了從 LIFOQueue 和 Deque 插入和檢索元素的不同方法。透過這兩種資料結構的程式,我們瞭解了這兩種資料結構的工作原理。因此,deque 被認為是一種高效的資料結構,因為它允許我們在常數時間內從兩端操作資料。Deque 也允許我們使用索引檢索資料,但它的效率低於從末尾檢索。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP