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批量按比例缩小图片脚本分享
May 21 Python
python多进程共享变量
Apr 06 Python
Python算法应用实战之栈详解
Feb 04 Python
Python下载网络小说实例代码
Feb 03 Python
对Python中数组的几种使用方法总结
Jun 28 Python
python代码过长的换行方法
Jul 19 Python
flask-restful使用总结
Dec 04 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python简单验证码识别的实现方法
May 10 Python
python列表每个元素同增同减和列表元素去空格的实例
Jul 20 Python
python如何为list实现find方法
May 30 Python
利用Python实时获取steam特惠游戏数据
Jun 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
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
destoon常用的安全设置概述
2014/06/21 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
PHP获取文件行数的方法
2015/06/10 PHP
JavaScript 学习 - 提高篇
2007/02/02 Javascript
js停止输出代码
2008/07/20 Javascript
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
Python异常学习笔记
2015/02/03 Python
python模拟Django框架实例
2016/05/17 Python
python如何调用百度识图api
2020/09/29 Python
计算机专业自荐信
2013/10/14 职场文书
高校自主招生自荐信
2013/12/09 职场文书
怎样写演讲稿
2014/01/04 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
查摆问题对照检查材料
2014/08/28 职场文书
2015年中学总务处工作总结
2015/07/22 职场文书
python实现ROA算子边缘检测算法
2021/04/05 Python
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers
tomcat下部署jenkins的方法
2022/05/06 Servers