Основное различие между циклической очередью и приоритетной очередью заключается в способе хранения элементов и доступа к ним. В циклической очереди элементы сохраняются в массиве фиксированного размера, а передний и задний указатели обтекают края массива. Это позволяет эффективно использовать память по мере роста и сокращения очереди. С другой стороны, очередь с приоритетами — это структура данных, в которой элементам назначаются приоритеты и которые хранятся таким образом, чтобы обеспечить доступ к элементу с наивысшим приоритетом в первую очередь.
Вот пример реализации циклической очереди и очереди с приоритетами в 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). Операция постановки в очередь добавляет элементы в конец очереди, а операция удаления из очереди удаляет элементы из начала очереди. Циклический характер очереди обеспечивает эффективное использование памяти.
В примере с приоритетной очередью элементам назначаются приоритеты и они сохраняются соответствующим образом. Операция опроса извлекает и удаляет из очереди элемент с наивысшим приоритетом. В этом примере элементы печатаются в порядке возрастания, поскольку используется естественный порядок по умолчанию. Однако вы можете предоставить собственный компаратор, чтобы определить свой собственный порядок приоритетов.