队列数组和链表的实现

队列 Queue

队列也是一种约束型数据结构,它跟栈的功能正好相反,遵循“先进先出,后进后出”原则,从它的名字我们就可以看出来。

在这里插入图片描述

队列的应用

队列在计算机中是一种朴素直观的设计应用,在各个领域都可以看见其身影。比如我们的 HTTP 请求,在服务器资源不足的情况下,它会天然的形成队列,先进先访问;再比如多线程软件,众多线程在资源不足的情况下也是按照队列的方式等待的。

队列的实现

数组的实现
from typing import Optional


class ArrayQueue:
    def __init__(self, capacity: int):
        self.items: list = [None] * capacity
        self.capacity = capacity
        self.head = 0
        self.tail = 0

    # 入队
    def enqueue(self, item: str) -> bool:
        if self.tail == self.capacity:
            return False
        self.items[self.tail] = item
        self.tail += 1
        return True

    # 出队
    def dequeue(self) -> Optional[str]:
        if self.head == self.tail:
            return None
        item = self.items[self.head]
        self.head += 1
        return item

    def __repr__(self) -> str:
        return str(self.items[self.head:self.tail])


if __name__ == "__main__":
    q = ArrayQueue(5)
    for i in range(5):
        q.enqueue(str(i))
    print(q)

    for _ in range(3):
        q.dequeue()
    print(q)

链表的实现

from typing import Optional


class ListNode:
    def __init__(self, data: str, next=None):
        self.data = data
        self.next = next


class LinkedQueue:
    def __init__(self):
        self.head: Optional[ListNode] = None
        self.tail: Optional[ListNode] = None

    # 入队
    def enqueue(self, value: str):
        new_node = ListNode(value)
        if self.tail:
            self.tail.next = new_node
        else:
            self.head = new_node
        self.tail = new_node

    # 出队
    def dequeue(self) -> Optional[str]:
        if self.head:
            value = self.head.data
            self.head = self.head.next
            if not self.head:
                self.tail = None
            return value

    def __repr__(self) -> str:
        values = []
        p: ListNode = self.head
        while p:
            values.append(p.data)
            p = p.next
        return "->".join(values)


if __name__ == "__main__":
    q = LinkedQueue()
    for i in range(5):
        q.enqueue(str(i))
    print(q)

    for _ in range(3):
        q.dequeue()
    print(q)

个人观点

栈和队列这种约束型的数据结构(按照它的严格约束型定义,不存在中间插入、删除和查询的功能),采用链表实现更加合理一点,无论是从动态拓展,还是开辟内存空间的角度来讲。另外数组在实现队列的过程中,随着队头和队尾的前移不能回退,使得它就像一次性的,这看上去也是一大弊端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值