数据结构与算法-05队列
队列#
队列(Queue)是一种线性数据结构,它的特点是只能在一端进行插入操作,在另一端进行删除操作,这一端被称为队尾(Rear),另一端被称为队头(Front)。队列的插入操作称为入队(Enqueue),删除操作称为出队(Dequeue)。
队列的特点是先进先出(First In First Out,FIFO),也就是最先入队的元素最先出队,而最后入队的元素最后出队。队列的应用非常广泛,例如任务调度、消息传递、缓存等。
队列可以用数组或链表实现。用数组实现的队列称为顺序队列(Sequential Queue),用链表实现的队列称为链式队列(Linked Queue)。
顺序队列的实现比较简单,只需要一个数组和两个指针来表示队列即可。队头指针指向队头元素的位置,队尾指针指向队尾元素的下一个位置,入队操作将元素插入到队尾指针指向的位置,队尾指针加1;出队操作将队头指针加1,返回队头元素。
顺序队列的缺点是当队列满时无法再插入元素,即使队列中有空闲位置。为了解决这个问题,可以使用循环队列(Circular Queue),即将队列的头尾相连,形成一个环。
链式队列的实现也比较简单,只需要一个链表和两个指针来表示队列即可。队头指针指向链表的头节点,队尾指针指向链表的尾节点,入队操作将元素插入到链表的尾部,队尾指针指向新的尾节点;出队操作将链表的头节点删除,队头指针指向新的头节点。
队列的实现#
class Queue(object):
def __init__(self):
self.__list = []
def enqueue(self, item):
self.__list.append(item)
def dequeue(self):
return self.__list.pop(0)
def is_empty():
return self.__list == []
def size():
return len(self.__list)
if __name__ == '__main__':
q = Queue()
q.enqueue(1)
双端队列的实现#
class Dqueue(object):
def __init__(self):
self.__list = []
def add_front(self, item):
self.__list.insert(0, item)
def add_rear(item):
self.__list.append(item)
def pop_front(self):
return self.__list.pop(0)
def pop_rear(self):
return self.__list.pop()
def is_empty():
return self.__list == []
def size():
return len(self.__list)
if __name__ == '__main__':
d = Dqueue()
优先级队列#
优先级队列(Priority Queue)是一种特殊的队列,它的元素带有优先级。在优先级队列中,元素按照优先级从高到低排序,优先级相同的元素按照插入顺序排序。优先级队列的出队操作总是返回优先级最高的元素。
优先级队列的应用非常广泛,例如任务调度、事件处理、路由算法等。
优先级队列可以用堆(Heap)实现,堆是一种完全二叉树,满足堆序性质:对于每个节点,它的优先级大于等于(或小于等于)它的子节点的优先级。堆可以用数组实现,数组中的元素按照完全二叉树的顺序存储。
Python中的heapq模块提供了堆的实现,可以用它来实现优先级队列。heapq模块提供了一些函数,例如heappush、heappop、heapify等,可以用来插入元素、删除元素、构建堆等操作。
以下是Python实现一个优先级队列的示例代码:
import heapq
class PriorityQueue:
def __init__(self):
self.heap = []
self.index = 0
def is_empty(self):
return len(self.heap) == 0
def put(self, item, priority):
heapq.heappush(self.heap, (priority, self.index, item))
self.index += 1
def get(self):
if self.is_empty():
raise Exception("Queue is empty")
_, _, item = heapq.heappop(self.heap)
return item
这个优先级队列使用一个堆来存储元素,每个元素是一个三元组,包括优先级、插入顺序和元素本身。优先级越高的元素排在堆的前面,插入顺序相同的元素按照优先级排序。你可以根据自己的需求对这个示例代码进行修改和扩展。
Python中的queue#
Python3中的queue模块提供了多种队列实现,包括FIFO队列、LIFO队列、优先级队列等。这些队列都是线程安全的,可以在多线程环境下使用。
FIFO队列(先进先出队列):使用queue.Queue类实现,支持多线程环境下的并发操作。#
import queue
q = queue.Queue()
q.put(1)
q.put(2)
q.put(3)
print(q.get()) # 1
print(q.get()) # 2
print(q.get()) # 3
LIFO队列(后进先出队列):使用queue.LifoQueue类实现,支持多线程环境下的并发操作。#
import queue
q = queue.LifoQueue()
q.put(1)
q.put(2)
q.put(3)
print(q.get()) # 3
print(q.get()) # 2
print(q.get()) # 1
优先级队列:使用queue.PriorityQueue类实现,支持多线程环境下的并发操作。元素按照优先级从小到大排序,优先级相同的元素按照插入顺序排序。#
import queue
q = queue.PriorityQueue()
q.put((3, "apple"))
q.put((1, "banana"))
q.put((2, "orange"))
print(q.get()) # (1, 'banana')
print(q.get()) # (2, 'orange')
print(q.get()) # (3, 'apple')
除了以上三种队列实现,queue模块还提供了其他一些队列实现,例如使用deque双端队列实现的队列、使用heapq模块实现的堆队列等。你可以根据自己的需求选择合适的队列实现。
作者:韩志超
出处:https://www.cnblogs.com/superhin/p/17464291.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
如有问题,请微信联系 superz-han,并发送原文链接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-06-07 Lua学习笔记