Python中的队列 || 堆、栈、队列之间的区别
Python中的队列
一、队列概念
1、队列是只有一端可以进行插入操作,而另一端可以进行删除操作的有序线性存储结构,满足先进先出的约束。
2、在计算机科学中,队列是一个集合,其中集合中的实体按顺序保存,集合上的主要(或唯一)操作是向后端位置添加实体,称为入队,前端位置并删除实体,称为出队。这使得队列成为先进先出(FIFO)数据结构。在FIFO数据结构中,添加到队列的第一个元素将是第一个要删除的元素。这相当于一旦添加新元素,在删除新元素之前必须删除之前添加的所有元素的要求。通常偷看或还输入了前面的操作,返回前面元素的值而不使其出列。队列是线性数据结构的示例,或者更抽象地是顺序集合。
3、队列提供计算机科学,运输和运营研究中的服务,其中存储和保存诸如数据,对象,人或事件的各种实体以便稍后处理。在这些上下文中,队列执行缓冲区的功能。队列在计算机程序中很常见,它们被实现为与访问例程耦合的数据结构,作为抽象数据结构或作为类的面向对象语言。常见的实现是循环缓冲区和链表。
- 生活中典型的实例就是排队,先到的人排在前面,可先得到服务,后到的人排在后面,并且不能插队。
- 计算机应用中典型的实例就是打印机,先发送的打印任务可以先被执行,之后的都要排队等候
二、Python实现
1、在 Python 中,和栈一样,同样可以用列表作为队列的底层实现,只需要确定列表的哪一端作为队列的头,也即删除操作端(先进先出),哪一端作为队列的尾,也即插入操作端(后进后出)。同时,把队列抽象为类,队列的先进先出操作实现为类的方法。
2、从理论上讲,队列的一个特征是它没有特定的容量。无论已包含多少元素,始终可以添加新元素。它也可以是空的,此时在再次添加新元素之前删除元素是不可能的。
3、队列的Python实现:
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应
Queue.get()从队列中移除并返回数据
Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
Queue.put(item[, block[, timeout]])
将item放入队列
1.timeout为正整数时,等待超时则抛出Full异常
3.block为False时,有空间可将数据放入队列,立即抛出Full异常
Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。
Queue.join() 实际上意味着等到队列为空,再执行别的操作【线程阻塞,直到队列中的所有任务处理完毕】
from Queue import Queue,LifoQueue,PriorityQueue #先进先出队列 q=Queue(maxsize=5) #后进先出队列 lq=LifoQueue(maxsize=6) #优先级队列 pq=PriorityQueue(maxsize=5) for i in range(5): q.put(i) lq.put(i) pq.put(i) print "先进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(q.queue,q.empty(),q.qsize(),q.full()) print "后进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full()) print "优先级队列:%s;是否为空:%s,多大,%s;是否满,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full()) print q.get(),lq.get(),pq.get() print "先进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(q.queue,q.empty(),q.qsize(),q.full()) print "后进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full()) print "优先级队列:%s;是否为空:%s,多大,%s;是否满,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full())
4、python的四种队列操作
①LILO: 先进先出,只能在尾部插入元素,只能从头部取出元素
from queue import Queue q = Queue() # 创建队列对象 q.put(1) # 队列尾部插入元素 q.put(2) q.put(3) print(q.queue) # 查看队列中的所有元素 a = q.get() # 返回并删除队列头部元素 print(a) print(q.queue) # 运行结果deque([2,3])
②LIFO:先进后出,类似栈
from queue import LifoQueue lifoQueue = LifoQueue() # 创建对象 lifoQueue.put(1) lifoQueue.put(2) lifoQueue.put(3) print(lifoQueue.queue) lifoQueue.get() # 返回并删除队列尾部元素 print(lifoQueue.queue) # 运行结果[1,2]
③优先队列:队列元素为元组类型,即(优先级,数据)。
from queue import PrioritQueue as pq pq = pq() # 创建有限队列 pq.put(1) pq.put(4) pq.put(3) print(pq.queue) # 运行结果[1,3,4] pq.get() # 返回并删除优先级最低的元素 print(pq.queue) # 运行结果[3,4]
④双端队列
>>> from collections import deque #双端队列 >>> dequeQueue = deque(['Eric','John','Smith']) >>> print(dequeQueue) deque(['Eric', 'John', 'Smith']) >>> dequeQueue.append('Tom') #在右侧插入新元素 >>> dequeQueue.appendleft('Terry') #在左侧插入新元素 >>> print(dequeQueue) deque(['Terry', 'Eric', 'John', 'Smith', 'Tom']) >>> dequeQueue.rotate(2) #循环右移2次 >>> print('循环右移2次后的队列',dequeQueue) 循环右移2次后的队列 deque(['Smith', 'Tom', 'Terry', 'Eric', 'John']) >>> dequeQueue.popleft() #返回并删除队列最左端元素 'Smith' >>> print('删除最左端元素后的队列:',dequeQueue) 删除最左端元素后的队列: deque(['Tom', 'Terry', 'Eric', 'John']) >>> dequeQueue.pop() #返回并删除队列最右端元素 'John' >>> print('删除最右端元素后的队列:',dequeQueue) 删除最右端元素后的队列: deque(['Tom', 'Terry', 'Eric'])
堆、栈、队列之间的区别
1、堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。
2、栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。(后进先出)
3、队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!