Python 实现数据结构-循环队列的操作方法


Posted in Python onJuly 17, 2019

今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法。

但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删除列表的第一个元素,那么在它之后的所有元素都要进行移动。所以当列表特别长的时候,这个代价就比较明显了。我们本文介绍的循环队列可以避免这个问题,同样我们上篇文章提到的用链表实现的方法也可以避免。

下面,我们来介绍循环队列。

循坏队列

循环队列,就是将普通的队列首尾连接起来, 形成一个环状,并分别设置首尾指针,用来指明队列的头和尾。每当我们插入一个元素,尾指针就向后移动一位,当然,在这里我们队列的最大长度是提前定义好的,当我们弹出一个元素,头指针就向后移动一位。

这样,列表中就不存在删除操作,只有修改操作,从而避免了删除前面节点造成的代价大的问题。

好,话不多说,我们用代码来实现一下

class Loopqueue:
 def __init__(self, length):
  self.head = 0
  self.tail = 0
  self.maxSize = length
  self.cnt = 0
  self.__list = [None]*length

这里同样,我们定义一个队列类,在实例化循环队列的时候,要求指定队列的大小,除了首尾指针以及队列最大长度之外,我们还声明一个表示队列当前长度的属性cnt。

接下来我们给队列增加一些操作:

判空

def isEmpty(self):
  return self.cnt == 0

判满

def isFull(self):
  return self.cnt == self.maxSize

添加元素

def push(self, data):
  if self.isFull():
   return False
  if self.isEmpty():
   self.__list[0] = data
   self.head = 0
   self.tail = 0
   self.cnt = 1
   return True
  self.tail = (self.tail+1)%self.maxSize
  self.cnt += 1
  self.__list[self.tail] = data
  return True

弹出元素

def pop(self):
  if self.isEmpty():
   return False
  data = self.__list[self.head]
  self.head = (self.head+1)%self.maxSize
  self.cnt -= 1
  return data

清空队列

def clear(self):
  self.head = 0
  self.tail = 0
  self.cnt = 0
  return True

定义len和print函数

def __len__(self):
  return self.cnt

 def __str__(self):
  s = ''
  for i in range(self.cnt):
   index = (i + self.head) % self.maxSize
   s += str(self.__list[index])+' '
  return s

OK,我们的循环队列类就定义好了,如果你看过介绍队列的文章,就会发现循环队列和普通队列的操作在逻辑上还是有一些相似的。

总结

以上所述是小编给大家介绍的Python 实现数据结构-循环队列的操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python 快速排序代码
Nov 23 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 Python
Python的Flask开发框架简单上手笔记
Nov 16 Python
详解Python中表达式i += x与i = i + x是否等价
Feb 08 Python
Django框架模板的使用方法示例
May 25 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
Django中间件拦截未登录url实例详解
Sep 03 Python
Python的历史与优缺点整理
May 26 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 Python
Pygame Draw绘图函数的具体使用
Nov 17 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 #Python
python中dict使用方法详解
Jul 17 #Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 #Python
python对矩阵进行转置的2种处理方法
Jul 17 #Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 #Python
纯python进行矩阵的相乘运算的方法示例
Jul 17 #Python
python中update的基本使用方法详解
Jul 17 #Python
You might like
超神学院:天使彦公认最美的三个视角,网友:我的天使快下凡吧!
2020/03/02 国漫
php MYSQL 数据备份类
2009/06/19 PHP
php 获得汉字拼音首字母的函数
2009/08/01 PHP
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
浅析Node.js实现HTTP文件下载
2016/08/05 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
vue中如何使用ztree
2018/02/06 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
python中使用mysql数据库详细介绍
2015/03/27 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
python对象转字典的两种实现方式示例
2019/11/07 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
财务助理岗位职责
2013/11/10 职场文书
通信研究生自荐信
2014/02/01 职场文书
高中英语教学反思
2014/02/04 职场文书
会计助理岗位职责
2014/02/17 职场文书
远程教育培训心得体会
2016/01/09 职场文书
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫