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 05 Python
python中装饰器级连的使用方法示例
Sep 29 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
python实现雨滴下落到地面效果
Jun 21 Python
解决python opencv无法显示图片的问题
Oct 28 Python
django session完成状态保持的方法
Nov 27 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
python list多级排序知识点总结
Oct 23 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
Feb 17 Python
python numpy库np.percentile用法说明
Jun 08 Python
Python list去重且保持原顺序不变的方法
Apr 03 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写的serv-u的web申请账号的程序
2006/10/09 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
layui点击按钮添加可编辑的一行方法
2018/08/15 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
pageGroup.js实现分页功能
2019/07/27 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
Python实现队列的方法
2015/05/26 Python
python图像常规操作
2017/11/11 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
python游戏开发的五个案例分享
2020/03/09 Python
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
优秀交警事迹材料
2014/01/26 职场文书
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
青年文明号创建承诺
2014/03/31 职场文书
幼儿园课题方案
2014/06/09 职场文书
电气自动化求职信
2014/06/24 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python