Python教程

基于python的数据结构之数组Queue

本文主要是介绍基于python的数据结构之数组Queue,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

思路:

  • 需要队头队尾指针
  • push操作:
    • 每次push, head + 1
  • pop操作:
    • pop队尾,tail + 1
  • 确保len(Queue) <= array_size
  • 到头之后取模返回就行
    • 这一点十分重要,这是能够无限进行pop和push的关键计算方法。不管
# -*- coding:utf-8 -*-
# Author:        Greed_Vic(PL Z)
# Product_name:  PyCharm
# File_name:     arrayQ 
# @Time:         21:23  2021/6/8

class Array(object):
    """
    定义一个数组
    """
    def __init__(self, size=32):
        self._size = size  # 设置数组长度
        self._items = [None] * size  # 开辟数组,初始None

    def __getitem__(self, index):
        return self._items[index]  # 特殊方法,用来获取此下标的元素

    def __setitem__(self, index, value):
        self._items[index] = value  # 特殊方法,用来赋值?

    def __len__(self):
        return self._size  # 特殊方法,获取长度 接受 len(array)

    def __iter__(self):
        for item in self._items:  # 特殊方法, 接受迭代
            yield item

    def clear(self, value=None):
        for i in range(self._items):
            self._items[i] = value  # 重置

class ArrayQueue(object):
    """
    数组队列
    """
    def __init__(self, maxsize=18):
        self.maxsize = maxsize
        self.array = Array(maxsize)
        self.head = 0
        self.tail = 0

    def push(self, val):
        if self.head - self.tail >= self.maxsize:  # 长度队列已经满了
            raise Exception('Full ArrayQueue')
        self.array[self.head % self.maxsize] = val  # 利用取模的方式进行获取位置
        self.head += 1  # 入队一个 head 加一

    def pop(self):
        if self.tail >= self.head:
            raise Exception('Empty ArrayQueue, you should push val first!')  # pop操作只能在有数据的情况下进行
        val = self.array[self.tail % self.maxsize]
        self.tail += 1
        return val

    def __len__(self):
        return self.head - self.tail  # 外界可用 len()方法进行获取长度


if __name__ == '__main__':
    """
    单测
    """
    def testAQ():
        size = 5
        q = ArrayQueue(size)
        for i in range(size):
            print(q.head, q.tail)
            
        assert len(q) == size

        assert q.pop() == 0

        assert q.pop() == 1
        q.push(9)

        assert len(q) == 4

        assert q.pop() == 2
        assert q.pop() == 3
        assert q.pop() == 4
        assert q.pop() == 9
        print("Test Done!")
    testAQ()
这篇关于基于python的数据结构之数组Queue的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!