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 相关文章推荐
Python3基础之函数用法
Aug 13 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
Python实现搜索算法的实例代码
Jan 02 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
使用Django搭建网站实现商品分页功能
May 22 Python
python图片灰度化处理的几种方法
Jun 23 Python
Python+Appium自动化测试的实战
Jun 30 Python
Python+Tkinter打造签名设计工具
Apr 01 Python
Python OpenCV之常用滤波器使用详解
Apr 07 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 信息采集程序代码
2009/03/17 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
php实现数据库的增删改查
2017/02/26 PHP
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
python ansible服务及剧本编写
2017/12/29 Python
Python的多维空数组赋值方法
2018/04/13 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
Python制作exe文件简单流程
2019/01/24 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
工程测量与监理专业应届生求职信
2013/11/27 职场文书
无故旷工检讨书
2014/01/26 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
出国签证在职证明范本
2014/11/24 职场文书
教师节倡议书2015
2015/04/27 职场文书
《别在吃苦的年纪选择安逸》读后感3篇
2019/11/30 职场文书
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android