python有序队列_Python for USACO——队列

01队列简介

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

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

02队列的ADT描述

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

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

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

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

03队列的Python 实现

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

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

04队列的应用举例

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

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

05总结

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

06作业

请大家登陆 www.usaco.vip 网站,然后搜索以下几道题目进行解答:

00043 :奇怪的电梯

00044 :家庭问题

00052 :最少步数

00075 :周末舞会

更多精彩内容,请关注公众号:少儿Python

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值