Python 中的 Queue.LIFOQueue 与 Collections.Deque
在本文中,我们将了解 Python 编程语言中的 Queue.LIFOQueue 与 Collections.Deque。当我们需要使用后进先出方法管理数据时,我们可以使用这些数据结构。但要选择其中之一,我们需要了解它们的功能和特性。在此之前,让我们先了解一下 Queue.LIFOQueue 和 Collections.Deque。
LIFOQueue
此类是队列模块的一部分。它作为堆栈数据结构工作,并且被认为是线程安全的,这意味着我们可以同时在不同的线程之间进行通信。以下是该类的一些规范。
基于堆栈 - LIFOQueue 的行为类似于堆栈数据结构,即最后插入的项目将在检索后首先出现。
线程安全 - 使用此类,我们可以应用同步机制并像多线程应用程序一样使用它。
阻塞 I/o 操作 - 在 Queue.LIFOQueue 中,我们可以选择使用 get() 和 put() 来阻塞线程。它使线程等待,直到满足条件,例如项目可用或队列为空。
Size − 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 模块的类。它作为一个双端队列工作,并且具有许多功能,以下是一些规范 -
基于双端队列 - Collections.deque 的行为类似于双端队列数据结构,支持从两端插入和删除操作。它有许多方法,如 append()、appendLeft() 将元素插入到双端队列中,以及 pop()、popLeft() 从双端队列中删除项目。
大小 - 与 LIFOQueue 不同,双端队列没有最大大小参数,它可以根据项目的长度动态增加和减少。
高效 - Dequeue 提供高效的操作,以恒定的时间复杂度从两端插入和检索元素。
让我们看一个 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.
解释
在此程序中,我们使用双端队列创建一个空队列。为了添加元素,我们使用 append() 方法并传递必须插入队列的元素。使用 popLeft() 方法,我们从队列中删除了该项目。然后我们检查队列是否为空,并使用 queue.append("Mango") 将另外两个项目附加到队列中。要从队列中删除所有项目,我们使用 while 循环并打印要删除的项目。
因此,我们看到了 Queue.LIFOQueue 和 Collections.Deque 之间的区别。我们了解了这两种数据结构的一些关键特性。我们看到了从 LIFOQueue 和双端队列插入和检索元素的不同方法。使用这两种数据结构的程序,我们了解了这两种数据结构的工作原理。因此,双端队列被认为是一种高效的数据结构,因为它允许我们在恒定时间内从两端操作数据。 Deque 也允许我们使用索引来检索数据,但是它的效率比从末尾检索要低。