欢迎访问宙启技术站
智能推送

Python中使用collections.deque实现优先级队列

发布时间:2023-12-15 17:03:46

在Python中,我们可以使用collections.deque来实现优先级队列。deque是一个双端队列,支持从队列的两端进行增删操作。我们可以根据元素的优先级将其插入到队列的适当位置。

首先,需要导入collections模块中的deque类:

from collections import deque

接下来,我们可以创建一个PriorityQueue类作为优先级队列的实现:

class PriorityQueue:
    def __init__(self):
        self.queue = deque()

    def is_empty(self):
        return len(self.queue) == 0

    def push(self, item, priority):
        """
        向优先级队列中插入元素
        :param item: 要插入的元素
        :param priority: 优先级
        """
        if self.is_empty():
            self.queue.append((item, priority))
        else:
            inserted = False
            for i in range(len(self.queue)):
                if priority < self.queue[i][1]:
                    self.queue.insert(i, (item, priority))
                    inserted = True
                    break
            if not inserted:
                self.queue.append((item, priority))

    def pop(self):
        """
        删除并返回优先级最高的元素
        :return: 优先级最高的元素
        """
        if self.is_empty():
            return "队列为空"
        return self.queue.popleft()[0]

    def peek(self):
        """
        返回优先级最高的元素,不删除
        :return: 优先级最高的元素
        """
        if self.is_empty():
            return "队列为空"
        return self.queue[0][0]

在上面的代码中,我们定义了优先级队列的几个基本操作:

- is_empty():检查队列是否为空

- push(item, priority):向队列插入元素,根据元素的优先级选择插入的位置

- pop():删除并返回队列中优先级最高的元素

- peek():返回队列中优先级最高的元素,但不删除

下面演示一个使用优先级队列的例子:

pq = PriorityQueue()
pq.push("Task1", 1)
pq.push("Task2", 3)
pq.push("Task3", 2)

print(pq.pop())  # 输出:Task1
print(pq.pop())  # 输出:Task3
print(pq.peek())  # 输出:Task2

在上面的例子中,我们先创建了一个优先级队列pq,然后按照优先级依次插入了3个任务。接下来,连续调用pop()方法删除并返回优先级最高的任务,最后使用peek()方法查看优先级最高的任务,但不删除。

总结:通过使用collections.deque和自定义的PriorityQueue类,可以很方便地实现一个简单的优先级队列。使用优先级队列可以解决需要按照优先级顺序处理元素的问题,例如任务调度、作业调度等情况。