数据结构-循环队列(Python实现)
今天我们来到了循环队列这一节,之前的文章中,我介绍过了用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实现)的更多相关文章
- C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
		
1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...
 - java数据结构---循环队列
		
#java学习经验总结------循环队列的实现(数组) package datastructure;/*数组实现循环队列 队列first in first out*/ public class Ci ...
 - Java数据结构——循环队列
		
普通顺序队列存在的问题在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后, ...
 - 用Python实现数据结构之队列
		
队列 队列与栈的类型很相似,但它遵循的原则是先进先出(FIFO),也就是元素插入的时候只能在该数据结构的末端,而删除只能删除最前面的元素.队列同样应用广泛,例如打印机的队列或者是一个web服务器响应请 ...
 - 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
		
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
 - [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
		
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...
 - JavaScript数据结构与算法(四) 循环队列的实现
		
实现击鼓传花,需要用到上一章所述队列类Queue TypeScript方式实现源码 let hotPotato = (nameList, num) => { let queue = new Qu ...
 - 【Java】 大话数据结构(7) 循环队列和链队列
		
本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...
 - python 循环队列的实现
		
最近在做一个东西的时候发现需要用到循环队列,实现先进先出(FIFO),不断往里面添加数据,当达到某个限定值时,最先进去的出去,然后再添加.之后需要对队列里面的内容进行一个筛选,作其他处理.首先我想到了 ...
 
随机推荐
- iis7下查看站点日志对应文件夹
			
原文:iis7下查看站点日志对应文件夹 IIS7下面默认日志文件的存放路径:%SystemDrive%\inetpub\logs\LogFiles 查看方法:点击对应网站 -> 右侧功能视图 - ...
 - C语言中.h和.c文件解析(转载)
			
转载:http://www.cnblogs.com/laojie4321/archive/2012/03/30/2425015.html 简单的说其实要理解C文件与头文件(即.h)有什么不同之处, ...
 - [转载]关于Java reference的一篇博文
			
不再额外的叨叨了,直接附上原地址: https://community.oracle.com/people/enicholas/blog/2006/05/04/understanding-weak-r ...
 - Tensorflow进阶
			
第一章 图像领域,第\(i\)类图片提取到的特征: \[ feature_i=\sum_jw_{i,j}x_j+b_i \] 其中,\(j\)表示一张图片的第\(j\)个像素,\(b_i\)是偏置值( ...
 - 学在LINUX下编程(各种情况比较详细)
			
(from http://www.712100.com/bbs/redirect.php?fid=160&tid=191752&goto=nextnewset) 预备知识 用gcc ...
 - C++实现半透明按钮控件(PNG,GDI+)
			
http://blog.csdn.net/witch_soya/article/details/6889904
 - postgres数据库小记
			
因为工作中需要查询其他部门数据库,刚好是postgres数据库,用python链接的话,可以用psycopg2库,具体用法其实和MysqlDB是一样的,就是安装的时候遇到点问题. 安装的时候,提示: ...
 - 闰平年简介及计算过程描述 - Java代码实现
			
import java.util.Scanner; /** * @author Shelwin Wei * 分析过程请参照<闰平年简介及计算过程描述>,网址 http://www.cnbl ...
 - GO方法与接口
			
Go语言没有沿袭传统面向对象编程中的诸多概念,比如继承.虚函数.构造函数和析构函数.隐藏的this指针等. 方法 Go 语言中同时有函数和方法.方法就是一个包含了接受者(receiver)的函数,re ...
 - python读取json文件并解析
			
# -*- coding: utf-8 -*- import os import json import sys reload(sys) sys.setdefaultencoding('utf-8') ...