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 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
10款最好的Web开发的 Python 框架
Mar 18 Python
Python入门_条件控制(详解)
May 16 Python
python实现壁纸批量下载代码实例
Jan 25 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
基于Python中numpy数组的合并实例讲解
Apr 04 Python
python实现超市扫码仪计费
May 30 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
在Python dataframe中出生日期转化为年龄的实现方法
Oct 20 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
Aug 19 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
php 删除cookie和浏览器重定向
2009/03/16 PHP
PHP中读写文件实现代码
2011/10/20 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
jQuery操作iframe中js函数的方法小结
2016/07/06 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
如何执行一个shell程序
2012/11/23 面试题
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
竞聘演讲稿
2014/04/24 职场文书
本科毕业生自荐信
2014/06/02 职场文书
主持人开场白台词
2015/05/29 职场文书
青春雷锋观后感
2015/06/10 职场文书
如何写好开幕词?
2019/06/24 职场文书
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js