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库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
Python AES加密模块用法分析
May 22 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
利用python对Excel中的特定数据提取并写入新表的方法
Jun 14 Python
利用pandas将numpy数组导出生成excel的实例
Jun 14 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
python 用所有标点符号分隔句子的示例
Jul 15 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
Python单元测试与测试用例简析
Nov 09 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
Feb 26 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
js同时按下两个方向键
2007/12/01 Javascript
js 小贴士一星期合集
2010/04/07 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
简单介绍Python中的JSON模块
2015/04/08 Python
在Django框架中编写Context处理器的方法
2015/07/20 Python
python 类详解及简单实例
2017/03/24 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
简单谈谈python基本数据类型
2018/09/26 Python
python使用PyQt5的简单方法
2019/02/27 Python
django如何通过类视图使用装饰器
2019/07/24 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
英国网上购买门:Direct Doors
2018/06/07 全球购物
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
应届生高等护理求职信
2013/10/12 职场文书
个人现实表现材料
2014/02/04 职场文书
生产部岗位职责范文
2014/02/07 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
探讨Java中的深浅拷贝问题
2021/06/26 Java/Android