Python实现的数据结构与算法之队列详解


Posted in Python onApril 22, 2015

本文实例讲述了Python实现的数据结构与算法之队列。分享给大家供大家参考。具体分析如下:

一、概述

队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行。

二、ADT

队列ADT(抽象数据类型)一般提供以下接口:

① Queue() 创建队列
② enqueue(item) 向队尾插入项
③ dequeue() 返回队首的项,并从队列中删除该项
④ empty() 判断队列是否为空
⑤ size() 返回队列中项的个数

队列操作的示意图如下:

Python实现的数据结构与算法之队列详解

三、Python实现

使用Python的内建类型list列表,可以很方便地实现队列ADT:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Queue:
  def __init__(self):
    self.items = []
  def enqueue(self, item):
    self.items.append(item)
  def dequeue(self):
    return self.items.pop(0)
  def empty(self):
    return self.size() == 0
  def size(self):
    return len(self.items)

四、应用

著名的 约瑟夫斯问题(Josephus Problem)是应用队列(确切地说,是循环队列)的典型案例。在 约瑟夫斯问题 中,参与者围成一个圆圈,从某个人(队首)开始报数,报数到n+1的人退出圆圈,然后从退出人的下一位重新开始报数;重复以上动作,直到只剩下一个人为止。

值得注意的是,Queue类只实现了简单队列,上述问题实际上需要用循环队列来解决。在报数过程中,通过“将(从队首)出队的人再入队(到队尾)”来模拟循环队列的行为。具体代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def josephus(namelist, num):
  simqueue = Queue()
  for name in namelist:
    simqueue.enqueue(name)
  while simqueue.size() > 1:
    for i in xrange(num):
      simqueue.enqueue(simqueue.dequeue())
    simqueue.dequeue()
  return simqueue.dequeue()
if __name__ == '__main__':
  print(josephus(["Bill", "David", "Kent", "Jane", "Susan", "Brad"], 3))

运行结果:

$ python josephus.py
Susan

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python实现的金山快盘的签到程序
Jan 17 Python
Python学习小技巧之利用字典的默认行为
May 20 Python
python处理按钮消息的实例详解
Jul 11 Python
Python列表推导式与生成器表达式用法示例
Feb 08 Python
在python中bool函数的取值方法
Nov 01 Python
python实现函数极小值
Jul 10 Python
python线程中的同步问题及解决方法
Aug 29 Python
python使用 cx_Oracle 模块进行查询操作示例
Nov 28 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
Python根据字典的值查询出对应的键的方法
Sep 30 Python
Pycharm github配置实现过程图解
Oct 13 Python
Python turtle编写简单的球类小游戏
Mar 31 Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 #Python
Hadoop中的Python框架的使用指南
Apr 22 #Python
Python实现提取文章摘要的方法
Apr 21 #Python
python中map、any、all函数用法分析
Apr 21 #Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 #Python
Python中实现参数类型检查的简单方法
Apr 21 #Python
python实现的jpg格式图片修复代码
Apr 21 #Python
You might like
通过对php一些服务器端特性的配置加强php的安全
2006/10/09 PHP
建立动态的WML站点(三)
2006/10/09 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
js推箱子小游戏步骤代码解析
2018/01/10 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
vue中tab选项卡的实现思路
2018/11/25 Javascript
前端性能优化建议
2020/09/17 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
使用Python脚本操作MongoDB的教程
2015/04/16 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
非常详细的C#面试题集
2016/07/13 面试题
绘画设计学生的个人自我评价
2013/09/20 职场文书
自我评价怎么写正确呢?
2013/12/02 职场文书
日语求职信范文
2013/12/17 职场文书
法学专业毕业生自荐信范文
2013/12/18 职场文书
教师求职自荐信
2014/03/09 职场文书
技校毕业生自荐信
2014/06/03 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
项目建议书
2015/02/04 职场文书
培训通知
2015/04/17 职场文书
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python