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 16 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
python 判断网络连通的实现方法
Apr 22 Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 Python
django 实现简单的插入视频
Apr 07 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
基于 Python 实践感知器分类算法
Jan 07 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 25 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数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
JS实现百度搜索框
2021/02/25 Javascript
[49:31]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第二场 1月29日
2021/03/11 DOTA
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
django初始化数据库的实例
2018/05/27 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
python实现简易学生信息管理系统
2020/04/05 Python
Python Pandas 转换unix时间戳方式
2019/12/07 Python
小学生母亲节演讲稿
2014/05/07 职场文书
诉前财产保全担保书
2014/05/20 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
读《钢铁是怎样炼成的》有感:百炼方成钢
2019/11/05 职场文书