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操作MongoDB基础知识
Nov 01 Python
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
常见的python正则用法实例讲解
Jun 21 Python
Python 含参构造函数实例详解
May 25 Python
pygame游戏之旅 创建游戏窗口界面
Nov 20 Python
python3使用matplotlib绘制散点图
Mar 19 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
Python基于Socket实现简单聊天室
Feb 17 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
python opencv人脸识别考勤系统的完整源码
Apr 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
建立文件交换功能的脚本(二)
2006/10/09 PHP
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
php一个找二层目录的小东东
2012/08/02 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
php微信开发之上传临时素材
2016/06/24 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
Jquery中getJSON在asp.net中的使用说明
2011/03/10 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
关于json字符串与实体之间的严格验证代码
2016/11/10 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
详解React 条件渲染
2020/07/08 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
Python计算矩阵的和积的实例详解
2020/09/10 Python
python如何使用腾讯云发送短信
2020/09/17 Python
Python random模块的使用示例
2020/10/10 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
怀念母亲教学反思
2014/04/28 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
2015年社区重阳节活动总结
2015/07/30 职场文书
深入理解python多线程编程
2021/04/18 Python
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android