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多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
Python中使用Inotify监控文件实例
Feb 14 Python
简单介绍Python中的JSON使用
Apr 28 Python
Python中的ConfigParser模块使用详解
May 04 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
Python解决走迷宫问题算法示例
Jul 27 Python
numpy添加新的维度:newaxis的方法
Aug 02 Python
Python如何实现转换URL详解
Jul 02 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
pytorch 数据处理:定义自己的数据集合实例
Dec 31 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
python有几个版本
Jun 17 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
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
laravel 数据验证规则详解
2019/10/23 PHP
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
详解JS面向对象编程
2016/01/24 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
layui 上传文件_批量导入数据UI的方法
2019/09/23 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
Python设计模式之命令模式简单示例
2018/01/10 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
在python中安装basemap的教程
2018/09/20 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
Python callable内置函数原理解析
2020/03/05 Python
Django框架请求生命周期实现原理
2020/11/13 Python
传播学毕业生求职信
2013/10/11 职场文书
五年级语文教学反思
2014/01/30 职场文书
党支部综合考察材料
2014/05/19 职场文书
优秀毕业生求职信
2014/06/05 职场文书
公司门卫工作职责
2014/06/28 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
个人租房协议书
2014/11/28 职场文书
高中班长竞选稿
2015/11/20 职场文书
七年级作文之雪景
2019/11/18 职场文书
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis
Mysql文件存储图文详解
2021/06/01 MySQL