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控制台显示时钟的示例
Feb 24 Python
Python描述器descriptor详解
Feb 03 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
详解Python开发中如何使用Hook技巧
Nov 01 Python
对Python中数组的几种使用方法总结
Jun 28 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
Python操作远程服务器 paramiko模块详细介绍
Aug 07 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
Sep 10 Python
python实现拼图小游戏
Feb 22 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
May 26 Python
利用python进行数据加载
Jun 20 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
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
php-7.3.6 编译安装过程
2020/02/11 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
HTML Dom与Css控制方法
2010/10/25 Javascript
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
python单链表实现代码实例
2013/11/21 Python
python批量提取word内信息
2015/08/09 Python
详解小白之KMP算法及python实现
2019/04/04 Python
Tensorflow实现多GPU并行方式
2020/02/03 Python
jupyter notebook实现显示行号
2020/04/13 Python
Python如何定义接口和抽象类
2020/07/28 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
JPA面试常见问题
2016/11/14 面试题
英文版销售经理个人求职信
2013/11/20 职场文书
财务会计毕业生个人求职信
2014/02/03 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
华清池导游词
2015/02/02 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书