pure python implementations of a fixed priority queue and an element priority queue using python lists tasks can be added to a priority queue at any time and in any order but when tasks are removed then the task with the highest priority is removed in fifo order in code we will use three levels of priority with priority zero tasks being the most urgent high priority and priority 2 tasks being the least urgent examples fpq fixedpriorityqueue fpq enqueue0 10 fpq enqueue1 70 fpq enqueue0 100 fpq enqueue2 1 fpq enqueue2 5 fpq enqueue1 7 fpq enqueue2 4 fpq enqueue1 64 fpq enqueue0 128 printfpq priority 0 10 100 128 priority 1 70 7 64 priority 2 1 5 4 fpq dequeue 10 fpq dequeue 100 fpq dequeue 128 fpq dequeue 70 fpq dequeue 7 printfpq priority 0 priority 1 64 priority 2 1 5 4 fpq dequeue 64 fpq dequeue 1 fpq dequeue 5 fpq dequeue 4 fpq dequeue traceback most recent call last datastructures queue priorityqueueusinglist underflowerror all queues are empty printfpq priority 0 priority 1 priority 2 add an element to a queue based on its priority if the priority is invalid valueerror is raised if the queue is full an overflowerror is raised return the highest priority element in fifo order if the queue is empty then an under flow exception is raised element priority queue is the same as fixed priority queue except that the value of the element itself is the priority the rules for priorities are the same the as fixed priority queue epq elementpriorityqueue epq enqueue10 epq enqueue70 epq enqueue4 epq enqueue1 epq enqueue5 epq enqueue7 epq enqueue4 epq enqueue64 epq enqueue128 printepq 10 70 4 1 5 7 4 64 128 epq dequeue 1 epq dequeue 4 epq dequeue 4 epq dequeue 5 epq dequeue 7 epq dequeue 10 printepq 70 64 128 epq dequeue 64 epq dequeue 70 epq dequeue 128 epq dequeue traceback most recent call last datastructures queue priorityqueueusinglist underflowerror the queue is empty printepq this function enters the element into the queue if the queue is full an exception is raised saying over flow return the highest priority element in fifo order if the queue is empty then an under flow exception is raised prints all the elements within the element priority queue tasks can be added to a priority queue at any time and in any order but when tasks are removed then the task with the highest priority is removed in fifo order in code we will use three levels of priority with priority zero tasks being the most urgent high priority and priority 2 tasks being the least urgent examples fpq fixedpriorityqueue fpq enqueue 0 10 fpq enqueue 1 70 fpq enqueue 0 100 fpq enqueue 2 1 fpq enqueue 2 5 fpq enqueue 1 7 fpq enqueue 2 4 fpq enqueue 1 64 fpq enqueue 0 128 print fpq priority 0 10 100 128 priority 1 70 7 64 priority 2 1 5 4 fpq dequeue 10 fpq dequeue 100 fpq dequeue 128 fpq dequeue 70 fpq dequeue 7 print fpq priority 0 priority 1 64 priority 2 1 5 4 fpq dequeue 64 fpq dequeue 1 fpq dequeue 5 fpq dequeue 4 fpq dequeue traceback most recent call last data_structures queue priority_queue_using_list underflowerror all queues are empty print fpq priority 0 priority 1 priority 2 add an element to a queue based on its priority if the priority is invalid valueerror is raised if the queue is full an overflowerror is raised return the highest priority element in fifo order if the queue is empty then an under flow exception is raised element priority queue is the same as fixed priority queue except that the value of the element itself is the priority the rules for priorities are the same the as fixed priority queue epq elementpriorityqueue epq enqueue 10 epq enqueue 70 epq enqueue 4 epq enqueue 1 epq enqueue 5 epq enqueue 7 epq enqueue 4 epq enqueue 64 epq enqueue 128 print epq 10 70 4 1 5 7 4 64 128 epq dequeue 1 epq dequeue 4 epq dequeue 4 epq dequeue 5 epq dequeue 7 epq dequeue 10 print epq 70 64 128 epq dequeue 64 epq dequeue 70 epq dequeue 128 epq dequeue traceback most recent call last data_structures queue priority_queue_using_list underflowerror the queue is empty print epq this function enters the element into the queue if the queue is full an exception is raised saying over flow return the highest priority element in fifo order if the queue is empty then an under flow exception is raised prints all the elements within the element priority queue
class OverFlowError(Exception):
    pass


class UnderFlowError(Exception):
    pass


class FixedPriorityQueue:
    

    def __init__(self):
        self.queues = [
            [],
            [],
            [],
        ]

    def enqueue(self, priority: int, data: int) -> None:
        
        try:
            if len(self.queues[priority]) >= 100:
                raise OverflowError("Maximum queue size is 100")
            self.queues[priority].append(data)
        except IndexError:
            raise ValueError("Valid priorities are 0, 1, and 2")

    def dequeue(self) -> int:
        
        for queue in self.queues:
            if queue:
                return queue.pop(0)
        raise UnderFlowError("All queues are empty")

    def __str__(self) -> str:
        return "\n".join(f"Priority {i}: {q}" for i, q in enumerate(self.queues))


class ElementPriorityQueue:
    

    def __init__(self):
        self.queue = []

    def enqueue(self, data: int) -> None:
        
        if len(self.queue) == 100:
            raise OverFlowError("Maximum queue size is 100")
        self.queue.append(data)

    def dequeue(self) -> int:
        
        if not self.queue:
            raise UnderFlowError("The queue is empty")
        else:
            data = min(self.queue)
            self.queue.remove(data)
            return data

    def __str__(self) -> str:
        
        return str(self.queue)


def fixed_priority_queue():
    fpq = FixedPriorityQueue()
    fpq.enqueue(0, 10)
    fpq.enqueue(1, 70)
    fpq.enqueue(0, 100)
    fpq.enqueue(2, 1)
    fpq.enqueue(2, 5)
    fpq.enqueue(1, 7)
    fpq.enqueue(2, 4)
    fpq.enqueue(1, 64)
    fpq.enqueue(0, 128)
    print(fpq)
    print(fpq.dequeue())
    print(fpq.dequeue())
    print(fpq.dequeue())
    print(fpq.dequeue())
    print(fpq.dequeue())
    print(fpq)
    print(fpq.dequeue())
    print(fpq.dequeue())
    print(fpq.dequeue())
    print(fpq.dequeue())
    print(fpq.dequeue())


def element_priority_queue():
    epq = ElementPriorityQueue()
    epq.enqueue(10)
    epq.enqueue(70)
    epq.enqueue(100)
    epq.enqueue(1)
    epq.enqueue(5)
    epq.enqueue(7)
    epq.enqueue(4)
    epq.enqueue(64)
    epq.enqueue(128)
    print(epq)
    print(epq.dequeue())
    print(epq.dequeue())
    print(epq.dequeue())
    print(epq.dequeue())
    print(epq.dequeue())
    print(epq)
    print(epq.dequeue())
    print(epq.dequeue())
    print(epq.dequeue())
    print(epq.dequeue())
    print(epq.dequeue())


if __name__ == "__main__":
    fixed_priority_queue()
    element_priority_queue()