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利用装饰器进行运算的实例分析
Aug 04 Python
详解Python爬虫的基本写法
Jan 08 Python
详解Golang 与python中的字符串反转
Jul 21 Python
Python程序运行原理图文解析
Feb 10 Python
python列表生成式与列表生成器的使用
Feb 23 Python
Python打印输出数组中全部元素
Mar 13 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
通过python检测字符串的字母
Feb 18 Python
如何让python的运行速度得到提升
Jul 08 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
Python文件操作及内置函数flush原理解析
Oct 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
PHP开发微信支付的代码分享
2014/05/25 PHP
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
2016/11/25 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
js 幻灯片的实现
2011/12/06 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
深入理解python中的select模块
2017/04/23 Python
Django rest framework实现分页的示例
2018/05/24 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
python画折线图的程序
2018/07/26 Python
python PrettyTable模块的安装与简单应用
2019/01/11 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
小学感恩教育活动总结
2014/07/07 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
期中考试后的感想
2015/08/07 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
Go语言怎么使用变长参数函数
2022/07/15 Golang