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代码实现
Aug 17 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
Python WEB应用部署的实现方法
Jan 02 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
使用Django搭建web服务器的例子(最最正确的方式)
Aug 29 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
使用IDLE的Python shell窗口实例详解
Nov 19 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
Mar 06 Python
Pycharm调试程序技巧小结
Aug 08 Python
python自动生成sql语句的脚本
Feb 24 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学习笔记之数组篇
2011/06/28 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
javascript与CSS复习(二)
2010/06/29 Javascript
jQuery bind事件使用详解
2011/05/05 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
浅谈js中的this问题
2017/08/31 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
使用python对文件中的数值进行累加的实例
2018/11/28 Python
Python笔记之facade模式
2019/11/20 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
白宫黑市官网:White House Black Market
2016/11/17 全球购物
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
美国探亲签证邀请信
2014/02/05 职场文书
考核工作实施方案
2014/03/30 职场文书
小学二年级评语
2014/04/21 职场文书
外贸业务员岗位职责
2015/02/13 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
如何在pycharm中快捷安装pip命令(如pygame)
2021/05/31 Python