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中用于计算对数的log()方法
May 15 Python
python自动裁剪图像代码分享
Nov 25 Python
Python 2.7中文显示与处理方法
Jul 16 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
Oct 11 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
Dec 23 Python
Python Django view 两种return的实现方式
Mar 16 Python
Python接口测试数据库封装实现原理
May 09 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
python中导入 train_test_split提示错误的解决
Jun 19 Python
python 字典和列表嵌套用法详解
Jun 29 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
广播爱好者需要了解的天线知识
2021/03/01 无线电
一个比较简单的PHP 分页分组类
2009/12/10 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
python如何实现int函数的方法示例
2018/02/19 Python
python实现随机漫步方法和原理
2019/06/10 Python
使用npy转image图像并保存的实例
2020/07/01 Python
Jupyter Notebook 安装配置与使用详解
2021/01/06 Python
市场营销专业推荐信
2013/11/03 职场文书
集体婚礼证婚词
2014/01/13 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
2016继续教育研修日志
2015/11/13 职场文书
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
css弧边选项卡的项目实践
2023/05/07 HTML / CSS