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