python 循環隊列的實現

  最近在作一個東西的時候發現須要用到循環隊列,實現先進先出(FIFO),不斷往裏面添加數據,當達到某個限定值時,最早進去的出去,而後再添加。以後須要對隊列裏面的內容進行一個篩選,做其餘處理。首先我想到了python的Queue模塊,先簡單的介紹一下,具體的能夠參考Queuehtml

1、Queue模塊python

Python queue模塊有三種隊列及構造函數:
  一、Python queue模塊的FIFO隊列先進先出。     class queue.queue(maxsize)
  二、LIFO相似於堆棧,即先進後出。                         class queue.Lifoqueue(maxsize)
  三、還有一種是優先級隊列級別越低越先出來。    class queue.Priorityqueue(maxsize)數組

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

  q.empty() 若是隊列爲空,返回True,反之False函數

  q.full() 若是隊列滿了,返回True,反之False測試

  q.get(block=Truetimeout=None]) 從隊列中返回並刪除一個元素,timeout等待時間spa

  q.get_nowait() 至關q.get(False)3d

  q.put(itemblock=Truetimeout=None)非阻塞 q.put(item) 寫入隊列,timeout等待時間code

  q.put_nowait(item) 至關q.put(item, False)htm

  q.task_done() 在完成一項工做以後q.task_done() 函數向任務已經完成的隊列發送一個信號

  q.join() 實際上意味着等到隊列爲空,再執行別的操做

  

  這裏引入Queue模塊就能夠實現FIFO了,當我要提取隊列裏面的數據的時候,我得利用get()方法先把數據提取出來,而後存入一個新的數組,因爲我要隔一段時間對裏面的數據進行提取,而get()方法提取的時候會刪除對應的元素,這樣有點兒不方便。所以我本身寫了一個類(寫的很差的地方,大神們能夠告訴我,不喜勿噴hh)

 

2、自定義一個類(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

 

3、測試

在文件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-')

相關文章
相關標籤/搜索