数据结构论坛

注册

 

发新话题 回复该主题

PythonforUSACO队列 [复制链接]

1#
北京看白癜风哪家医院最好 https://wapjbk.39.net/yiyuanzaixian/bjzkbdfyy/xcxbdf/

01队列简介

上面这张图的情形想必大家都很了解,在生活中,难免会有很多排队,排队的时候,新来的人只能排在最末尾(直接插队是要被打的),越是排前面的人,能够越早的享受到服务,所以队列是一个先进先出(FIFO:FirstInFirstOut)的模型。

队列是一个应用非常广泛的数据模型,当很多人需要共享某一个服务,而这个服务又无法同时满足所有人的时候,就需要通过队列把等待的人组织起来,然后按照优先级享受服务。生活中到处都充满了排队,例如小朋友想吃肯德基,在购买前就需要排队等待。在电脑应用中,也有很多排队的场景,例如当多个人都想使用打印机时也需要排队,打印机只能一个个满足大家的打印需求,暂时无法打印的任务就排在队列中。

02队列的ADT描述

通过上面的描述,可以概括队列的特性如下:

队列仅有一个入口和一个出口,不允许数据项插入到中间,也不允许从中间移除数据项新加入的数据必须在数据集末尾等待,而即将享受服务的则是排在队首的模型符合先进先出(FIFO)规则

了解了上面的这些信息后,就能很容易回答学习数据结构的两个经典问题了:

数据是以什么样的结构存储的?队列的数据以线性方式存储就可以了,需要按照插入队列的时间有序的保存。例如Python的list就能作为队列底层的存储方式。如何对数据进行增、删、查、改等操作队列只有一个入口和出口,增加操作只能发生在入口端,删除操作只能发生在出口端。队列不支持遍历查找,也不支持对某个队列元素进行修改。所以,队列的ADT可以描述如下图:

03队列的Python实现

Python默认给出了一个队列模块,其中的队列实现非常完善,并且支持多线程版本(这个话题有点大,就不展开了)。在这里,我们也给出一套纯手工打造的队列代码,如下:

上述程序中,使用Python的list来实现了队列的操作,队列的所有操作,list都基本上已经支持了,实现代码非常简单便捷。

04队列的应用举例

接下来大家看看以下题目如何求解?

这是一道典型的队列题目,男士和女士分别站成,每首舞曲开始后,排在队列最前的一对男女就开始跳舞,本轮跳舞结束后,就分别站在各自队列的最后面。使用两个队列就完全可以模拟上述题目的要求。

05总结

通过本文的学习,相信大家都已经了解了队列的特性,它是一个先进先出(FIFO)的模型,和堆栈的后进先出(FILO)截然不同。队列在程序设计中使用的非常广泛,凡是需要排队获取资源的情形都需要使用到队列,队列的Python实现也非常简单,本文使用list给出了一份简洁的代码,在实际编码中,你也可以直接使用系统自带的queue库。

06作业

请大家登陆

分享 转发
TOP
发新话题 回复该主题