Python 中的 Queue.LIFOQueue 与 Collections.Deque

pythonserver side programmingprogramming更新于 2023/8/31 17:27:00

在本文中,我们将了解 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 也允许我们使用索引来检索数据,但是它的效率比从末尾检索要低。


相关文章