a queue using a linked list like structure from future import annotations from collections abc import iterator from typing import any class node def initself data any none self data any data self next node none none def strself str return fself data class linkedqueue def initself none self front node none none self rear node none none def iterself iteratorany node self front while node yield node data node node next def lenself int return lentupleiterself def strself str return joinstritem for item in self def isemptyself bool return lenself 0 def putself item any none node nodeitem if self isempty self front self rear node else assert isinstanceself rear node self rear next node self rear node def getself any if self isempty raise indexerrordequeue from empty queue assert isinstanceself front node node self front self front self front next if self front is none self rear none return node data def clearself none self front self rear none if name main from doctest import testmod testmod queue linkedqueue queue is_empty true queue put 5 queue put 9 queue put python queue is_empty false queue get 5 queue put algorithms queue get 9 queue get python queue get algorithms queue is_empty true queue get traceback most recent call last indexerror dequeue from empty queue queue linkedqueue for i in range 1 6 queue put i len queue 5 for i in range 1 6 assert len queue 6 i _ queue get len queue 0 queue linkedqueue for i in range 1 4 queue put i queue put python queue put 3 14 queue put true str queue 1 2 3 python 3 14 true queue linkedqueue queue is_empty true for i in range 1 6 queue put i queue is_empty false queue linkedqueue queue get traceback most recent call last indexerror dequeue from empty queue for i in range 1 6 queue put i str queue 1 2 3 4 5 queue linkedqueue queue get traceback most recent call last indexerror dequeue from empty queue queue linkedqueue for i in range 1 6 queue put i for i in range 1 6 assert queue get i len queue 0 queue linkedqueue for i in range 1 6 queue put i queue clear len queue 0 str queue
from __future__ import annotations

from collections.abc import Iterator
from typing import Any


class Node:
    def __init__(self, data: Any) -> None:
        self.data: Any = data
        self.next: Node | None = None

    def __str__(self) -> str:
        return f"{self.data}"


class LinkedQueue:
    

    def __init__(self) -> None:
        self.front: Node | None = None
        self.rear: Node | None = None

    def __iter__(self) -> Iterator[Any]:
        node = self.front
        while node:
            yield node.data
            node = node.next

    def __len__(self) -> int:
        
        return len(tuple(iter(self)))

    def __str__(self) -> str:
        
        return " <- ".join(str(item) for item in self)

    def is_empty(self) -> bool:
        
        return len(self) == 0

    def put(self, item: Any) -> None:
        
        node = Node(item)
        if self.is_empty():
            self.front = self.rear = node
        else:
            assert isinstance(self.rear, Node)
            self.rear.next = node
            self.rear = node

    def get(self) -> Any:
        
        if self.is_empty():
            raise IndexError("dequeue from empty queue")
        assert isinstance(self.front, Node)
        node = self.front
        self.front = self.front.next
        if self.front is None:
            self.rear = None
        return node.data

    def clear(self) -> None:
        
        self.front = self.rear = None


if __name__ == "__main__":
    from doctest import testmod

    testmod()