基于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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JamePrin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值