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开发常用的一些开源Package分享
Feb 14 Python
详解Python设计模式编程中观察者模式与策略模式的运用
Mar 02 Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
numpy中的高维数组转置实例
Apr 17 Python
python中dir()与__dict__属性的区别浅析
Dec 10 Python
Python定时任务随机时间执行的实现方法
Aug 14 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
基于Python实现粒子滤波效果
Dec 01 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 Python
python+opencv实现车道线检测
Feb 19 Python
Python中使用subprocess库创建附加进程
May 11 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循环获取GET和POST值的代码
2008/04/09 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
PHP利用header跳转失效的解决方法
2014/10/24 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
JavaScript函数、方法、对象代码
2008/10/29 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
mui上拉加载功能实例详解
2017/04/13 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
Python获取某一天是星期几的方法示例
2017/01/17 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
美国家具网站:Cymax
2016/09/17 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
室内设计自我鉴定
2013/10/15 职场文书
工程专业求职自荐书范文
2014/02/08 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
学生犯错保证书
2015/05/09 职场文书
勤俭节约主题班会
2015/08/13 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers