最近在做一个东西的时候发现需要用到循环队列,实现先进先出(FIFO),不断往里面添加数据,当达到某个限定值时,最先进去的出去,然后再添加。之后需要对队列里面的内容进行一个筛选,作其他处理。首先我想到了python的Queue模块,先简单的介绍一下,具体的可以参考Queue

一、Queue模块

Python queue模块有三种队列及构造函数:
  1、Python queue模块的FIFO队列先进先出。     class queue.queue(maxsize)
  2、LIFO类似于堆栈,即先进后出。                         class queue.Lifoqueue(maxsize)
  3、还有一种是优先级队列级别越低越先出来。    class queue.Priorityqueue(maxsize)

此包中的常用方法(q =queue.queue()):
  q.qsize() 返回队列的大小

  q.empty() 如果队列为空,返回True,反之False

  q.full() 如果队列满了,返回True,反之False

  q.get(block=Truetimeout=None]) 从队列中返回并删除一个元素,timeout等待时间

  q.get_nowait() 相当q.get(False)

  q.put(itemblock=Truetimeout=None)非阻塞 q.put(item) 写入队列,timeout等待时间

  q.put_nowait(item) 相当q.put(item, False)

  q.task_done() 在完成一项工作之后q.task_done() 函数向任务已经完成的队列发送一个信号

  q.join() 实际上意味着等到队列为空,再执行别的操作

  

  这里引入Queue模块就可以实现FIFO了,当我要提取队列里面的数据的时候,我得利用get()方法先把数据提取出来,然后存入一个新的数组,由于我要隔一段时间对里面的数据进行提取,而get()方法提取的时候会删除对应的元素,这样有点儿不方便。因此我自己写了一个类(写的不好的地方,大神们可以告诉我,不喜勿喷hh)

二、自定义一个类(circular_queue.py)

# 定义队列类
class MyQueue(object):
def __init__(self, size):
self.size = size # 定义队列长度
self.queue = [] # 存储队列 列表 def __str__(self):
# 返回对象的字符串表达式,方便查看
return str(self.queue) def inQueue(self, n):
# 入队
if self.isFull():
return -1
self.queue.append(n) # 列表末尾添加新的对象 def outQueue(self):
# 出队
if self.isEmpty():
return -1
firstelement = self.queue[0] # 删除队头元素
self.queue.remove(firstelement) # 删除队操作
return firstelement def delete(self, n):
# 删除某元素
element = self.queue[n]
self.queue.remove(element) def inPut(self, n, m):
# 插入某元素 n代表列表当前的第n位元素 m代表传入的值
self.queue[n] = m def getSize(self):
# 获取当前长度
return len(self.queue) def getnumber(self, n):
# 获取某个元素
element = self.queue[n]
return element def isEmpty(self):
# 判断是否为空
if len(self.queue) == 0:
return True
return False def isFull(self):
# 判断队列是否满
if len(self.queue) == self.size:
return True
return False

三、测试

在文件circular_queue.py中类的下头继续添加如下代码

queue = MyQueue(5)  # 定义一个大小为5的队列
for i in range(8):
# 先判断队列是否为满
if not queue.isFull():
queue.inQueue(i)
else:
# 先出队再添加
queue.outQueue()
queue.inQueue(i)
print(queue)

运行结果如下

  可以看出已经实现了,当然你也可以试试其他几种方法,比如提取元素,获取队列大小等等。接下来就可以像操作列表对元素进行提取,并且不会删除元素。

for i in range(queue.getSize()):
item =queue.getnumber(i)
print(item)

  当然也可以把circular_queue。py文件单独保存,然后到其他文件中引入,放入同一文件夹下,新建test.py,然后运行试试:

from circular_queue import *
import time def fun2(num):
num += 1
return num def fun1(num, res):
while True:
num = fun2(num)
# 先判断队列是否为满
if not queue.isFull():
queue.inQueue([num, res])
else:
# 先出队再添加
queue.outQueue()
queue.inQueue([num, res])
print(queue)
time.sleep(2) if __name__ == "__main__":
queue = MyQueue(5)
fun1(0, '-aaa-')

python 循环队列的实现的更多相关文章

  1. 数据结构-循环队列(Python实现)

    今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...

  2. [py]约瑟夫问题-循环队列

    约瑟夫问题(历史战争问题) 直观理解 老外视频讲解 模拟器演示 约瑟夫问题 数学姥公众号 讲的最清楚 背景及,推倒过程讲解得很清晰,旨在提高人们对数据的兴趣 简单说下: 几个人围成一圈(循环队列), ...

  3. Python消息队列工具 Python-rq 中文教程

    原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...

  4. Python 用队列实现多线程并发

    # Python queue队列,实现并发,在网站多线程推荐最后也一个例子,比这货简单,但是不够规范 # encoding: utf-8 __author__ = 'yeayee.com' # 由本站 ...

  5. C++数组实现的循环队列

    #include<iostream> #include <string> /* 功能:数组实现的循环队列,C++实现,学习参考 */ using namespace std; ...

  6. Python循环语句

    1.Python循环类型 1.while循环:在某条件下,循环执行某段程序 a. while语句有两个重要命令:continue,break来跳出循环. continue用来跳出该次循环 break用 ...

  7. C ~ 链式队列与循环队列

          此处的链式与循环队列可以应用于BFS和树的层序遍历.下面是对其结构和基本操作的程序描述. 1.循环队列 解决循环队列的队空和队满的方法: [1].增加一个参数count,用来记录数组中当前 ...

  8. 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

  9. 使用 JavaScript 实现基本队列、优先队列和循环队列

    1.基本队列的实现 基本队列的方法中,包含了 ①向队列(尾部)中添加元素(enqueue).②(从队列头部)删除元素(dequeue).③查看队列头部的元素(front).④查看队列是否为空(isEm ...

随机推荐

  1. TX大手笔做业务必然失败的原因

    首先说一个伪命题: 物体会向下落这是一个基本的定律,一个小小的物理规则会覆盖所有物体的行为准则. 那么,当地球上的所有东西都下落的时候,你指望整个地球,月球,太阳也会下落么? 事实上大家都知道星球在宇 ...

  2. svn和git的优缺点

    git官网api: https://git-scm.com/docs 一. 集中式vs分布式 1. Subversion属于集中式的版本控制系统集中式的版本控制系统都有一个单一的集中管理的服务器,保存 ...

  3. yii---判断POST请求

    我们在进行数据的提交的时候,很多时候会判断请求状态来进行不同的选择.常见的就是判断POST以及GET的请求方式,下面是YII判断POST请求的代码示例: public function actionP ...

  4. 二步实现 远程连接 阿里云SqlServer 2012 数据库服务器

    前言:在使用 阿里云 上的一些产品时,遇到不少坑. 安装IIS 时,遇到 因买的配置过低,虚拟内存不足,而导致 IIS 总是安装失败: 现在 在上面安装了个 Sql Sever 2012,远程老是 不 ...

  5. ubuntu16.04安装 lrzsz

    编译安装 root 账号登陆后,依次执行以下命令: tar zxvf lrzsz-.tar.gz cd lrzsz- ./configure make make install 上面安装过程默认把ls ...

  6. hihocoder 1829 - 压缩字符串 - [状压+暴力枚举][2018ICPC北京网络预赛B题]

    题目链接:https://hihocoder.com/problemset/problem/1829 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, ...

  7. 计蒜客 30996 - Lpl and Energy-saving Lamps - [线段树][2018ICPC南京网络预赛G题]

    题目链接:https://nanti.jisuanke.com/t/30996 During tea-drinking, princess, amongst other things, asked w ...

  8. POJ 2398 - Toy Storage - [计算几何基础题][同POJ2318]

    题目链接:http://poj.org/problem?id=2398 Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad ...

  9. 最长回文 HDU - 3068 manacher 模板题

    题意:找串的最长回文字串(连续) 题解:manacher版题 一些理解:首位加上任意两个字符是为了判断边界. 本算法主要是为了 1.省去奇偶分类讨论. 2.防止形如aaaaaaa的串使得暴力算法蜕化为 ...

  10. CCCC 月饼

    https://www.patest.cn/contests/gplt/L2-003 题解:按平均值贪心. 坑:有一个样例卡住了,是因为 while (i<=n&&x - bs[ ...