Круговая очередь и очередь с приоритетами: сравнение реализации Java

Основное различие между циклической очередью и приоритетной очередью заключается в способе хранения элементов и доступа к ним. В циклической очереди элементы сохраняются в массиве фиксированного размера, а передний и задний указатели обтекают края массива. Это позволяет эффективно использовать память по мере роста и сокращения очереди. С другой стороны, очередь с приоритетами — это структура данных, в которой элементам назначаются приоритеты и которые хранятся таким образом, чтобы обеспечить доступ к элементу с наивысшим приоритетом в первую очередь.

Вот пример реализации циклической очереди и очереди с приоритетами в Java:

Пример кольцевой очереди:

class CircularQueue {
    private int[] queue;
    private int front;
    private int rear;
    private int size;

    public CircularQueue(int maxSize) {
        queue = new int[maxSize];
        front = -1;
        rear = -1;
        size = 0;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public boolean isFull() {
        return size == queue.length;
    }

    public void enqueue(int data) {
        if (isFull()) {
            System.out.println("Queue is full");
            return;
        }
        if (isEmpty()) {
            front = 0;
        }
        rear = (rear + 1) % queue.length;
        queue[rear] = data;
        size++;
    }

    public int dequeue() {
        if (isEmpty()) {
            throw new NoSuchElementException("Queue is empty");
        }
        int data = queue[front];
        if (front == rear) {
            front = -1;
            rear = -1;
        } else {
            front = (front + 1) % queue.length;
        }
        size--;
        return data;
    }

    public int front() {
        if (isEmpty()) {
            throw new NoSuchElementException("Queue is empty");
        }
        return queue[front];
    }

    public int rear() {
        if (isEmpty()) {
            throw new NoSuchElementException("Queue is empty");
        }
        return queue[rear];
    }
}

Пример приоритетной очереди:

import java.util.PriorityQueue;

class PriorityQueueExample {
    public static void main(String[] args) {
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

        priorityQueue.add(5);
        priorityQueue.add(3);
        priorityQueue.add(8);
        priorityQueue.add(1);

        while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.poll());
        }
    }
}

В примере с кольцевой очередью элементы добавляются и удаляются в порядке поступления (FIFO). Операция постановки в очередь добавляет элементы в конец очереди, а операция удаления из очереди удаляет элементы из начала очереди. Циклический характер очереди обеспечивает эффективное использование памяти.

В примере с приоритетной очередью элементам назначаются приоритеты и они сохраняются соответствующим образом. Операция опроса извлекает и удаляет из очереди элемент с наивысшим приоритетом. В этом примере элементы печатаются в порядке возрастания, поскольку используется естественный порядок по умолчанию. Однако вы можете предоставить собственный компаратор, чтобы определить свой собственный порядок приоритетов.