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之有容乃大的list(3)
Sep 15 Python
python映射列表实例分析
Jan 26 Python
Python中正则表达式详解
May 17 Python
python放大图片和画方格实现算法
Mar 30 Python
Python查找第n个子串的技巧分享
Jun 27 Python
python统计字母、空格、数字等字符个数的实例
Jun 29 Python
Python补齐字符串长度的实例
Nov 15 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 Python
用python的turtle模块实现给女票画个小心心
Nov 23 Python
python读取当前目录下的CSV文件数据
Mar 11 Python
pycharm 关闭search everywhere的解决操作
Jan 15 Python
python区块链持久化和命令行接口实现简版
May 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+codeigniter 通过.htcaccess做动态二级域名解析
2012/07/01 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
php操作redis缓存方法分享
2015/06/03 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
prototype 学习笔记整理
2009/07/17 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
javascript获取以及设置光标位置
2017/02/16 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
react-router实现按需加载
2017/05/09 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
深入解析Python中的WSGI接口
2015/05/11 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Django websocket原理及功能实现代码
2020/11/14 Python
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
学年自我鉴定范文
2013/10/01 职场文书
电气自动化自荐信
2013/10/10 职场文书
妇产科护士自我鉴定
2013/10/15 职场文书
个性大学生自我评价
2013/12/04 职场文书
公务员转正考察材料
2014/02/07 职场文书
雨雪天气温馨提示
2015/07/15 职场文书
运动会入场词
2015/07/18 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL