zoukankan      html  css  js  c++  java
  • python 循环队列的实现

      最近在做一个东西的时候发现需要用到循环队列,实现先进先出(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-')

  • 相关阅读:
    zookeeper分布式锁
    zookeeper集群,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的。
    理解分布式系统
    zookeeper
    Codeforces Round #261 (Div. 2)[ABCDE]
    L脚本语言语法手冊 0.10版
    [Lua]mac 上安装lua
    extjs 按条件查询出的数据在grid上不显示
    木桶效应
    Shuttle ESB(四)——公布订阅模式实例介绍(1)
  • 原文地址:https://www.cnblogs.com/xiaxuexiaoab/p/8593146.html
Copyright © 2011-2022 走看看