- 1 基本数据结构
- 2 栈的概念
- 3 栈的抽象数据类型
- 4 栈的实现
- 5 栈的应用之圆括号平衡
- 6 栈的应用之符号平衡(通用)
- 7 栈的应用之进制转换
- 8 栈的应用之中缀前缀后缀
- 9 中缀后前缀、后缀的转换思路
- 10 栈的应用之中缀转后缀表达式算法的实现
- 11 后缀表达式求值
- 12 队列的概念
- 13 队列的抽象数据类型
- 14 队列的 python 实现
- 15 队列应用之烫手的山芋
- 16 队列应用之 打印任务
- 17 列表
- 18 无序列表的实现
- 19 有序列表 ADT 及实现
- 20 递归和递归三定律
- 21 递归的实现和应用
- 22 递归图形
- 23 宾斯基三角形
- 24 汉诺塔问题(河内塔问题)
- 25 探索迷宫
- 26 动态规划
- 27 排序与查找 顺序查找
- 28 二分查找
- 30 冒泡排序
- 31 选择排序
- 29-1 哈希查找
- 29-2 冲突解决
- 29-3 用哈希表实现映射
- 32 插入排序
- 33 希尔排序
- 34 归并排序
- 35 快速排序
- 36 树的基本概念
- 37 树的实现
- 38 分析树
- 39 树的遍历
15 队列应用之烫手的山芋
为了展示队列的应用,我们模拟一种真实的先进先出的情形。作为开始,我们观察一种儿童游戏,叫烫手的山芋(hotpotato),在这个游戏中(图 2),孩子们排成一圈,把手里的东西一个传一个,在某种情形下,停止传递,手上拿着烫手的山芋的人就要被清出来,其他的人继续玩,直到只剩一个人。
从现代意义上说,这个游戏等价于著名的约瑟夫问题。据说,一世纪左右,历史学家弗拉维约瑟夫与犹太人一起反抗罗马。一次,约瑟夫和他的 39 个同志一起在山洞里抵抗,不过眼看就要失败了,他们决定宁死也不做罗马的奴隶。他们围坐成一圈,一个人一个编号,按时针方向,每第七个人就要被杀死。据说约瑟夫是个数学家,他马上就知道按这规则,应该坐在哪个位置会留到最后。看来约瑟夫最后没有自杀,相反却投降了。这个故事有很多版本,有的版本说是每 3 个人杀一个,有的说最后一个人可以骑马逃脱,但不管怎样,思想是相同的。
我们引入一个烫手的山芋的模拟过程,参数是一个名字列表和一个常数 num。num 用来计数,最后函数返回经多轮计数后,剩下的最后一个人的名字。后来发生什么,就看你的了。
为了模拟这个圆圈,我们使用队列(图 3)。假定开始拿着山芋的孩子站在队伍的前端,一经传出山芋后,模拟程序只需要简单地把这个孩子移出队列,然后再将他加入尾部,然后他在尾部再逐步前移,直到再次轮到他。
经过 num 次出队入队之后,前端的孩子最终被完全清出队列,然后剩余的人继续游戏,直到最后一个。
下面是实现代码,最后面是用 7 个名字和数字 3 来调用这个方法,最后剩下那个叫 Susan。
from pythonds.basic.queue import Queue def hotPotato(namelist, num): simqueue = Queue() for name in namelist: simqueue.enqueue(name) while simqueue.size() >1: for i in range(num): simqueue.enqueue(simqueue.dequeue()) simqueue.dequeue() return simqueue.dequeue() print(hotPotato(["Bill","David","Susan","Jane","Kent","Brad"],7))
(译者注)译者认为这个算法与约瑟夫问题差别明显,具体讨论在 http://blog.csdn.net/python2014/article/details/21231985
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论