Реализация очереди на Java — пошаговая реализация с массивом
Чтобы понять этот пример, нужно знать следующие темы:
Интерфейс Queue в Java
Дженерики в Java
Пример 1: Программа Java для реализации Queue
public class Queue {
int SIZE = 5;
int items[] = new int[SIZE];
int front, rear;
Queue() {
front = -1;
rear = -1;
}
// проверяем, заполнена ли очередь
boolean isFull() {
if (front == 0 && rear == SIZE - 1) {
return true;
}
return false;
}
// проверяем, пуста ли очередь
boolean isEmpty() {
if (front == -1)
return true;
else
return false;
}
// вставляем элементы в очередь
void enQueue(int element) {
// если очередь заполнена
if (isFull()) {
System.out.println("Queue is full");
}
else {
if (front == -1) {
// помечаем front как первый элемент очереди
front = 0;
}
rear++;
// вставляем элемент в конец
items[rear] = element;
System.out.println("Insert " + element);
}
}
// удаляем элемент из очереди
int deQueue() {
int element;
// если очередь пуста
if (isEmpty()) {
System.out.println("Queue is empty");
return (-1);
}
else {
// удаляем элемент из начала очереди
element = items[front];
// если в очереди только один элемент
if (front >= rear) {
front = -1;
rear = -1;
}
else {
// помечаем следующий элемент как front
front++;
}
System.out.println( element + " Deleted");
return (element);
}
}
// отображаем элементы очереди
void display() {
int i;
if (isEmpty()) {
System.out.println("Empty Queue");
}
else {
// отображаем начало очереди
System.out.println("\nFront index-> " + front);
// отображаем элементы очереди
System.out.println("Items -> ");
for (i = front; i <= rear; i++)
System.out.print(items[i] + " ");
// отображаем конец очереди
System.out.println("\nRear index-> " + rear);
}
}
public static void main(String[] args) {
// создаём объект класса Queue
Queue q = new Queue();
// пытаемся удалить элемент из очереди
// сейчас очередь пуста
// поэтому удаление невозможно
q.deQueue();
// вставляем элементы в очередь
for(int i = 1; i < 6; i ++) {
q.enQueue(i);
}
// 6-й элемент не может быть добавлен, так как очередь полна
q.enQueue(6);
q.display();
// deQueue удаляет элемент, добавленный первым, т.е. 1
q.deQueue();
// Теперь у нас всего 4 элемента
q.display();
}
}
Вывод:
Queue is empty
Insert 1
Insert 2
Insert 3
Insert 4
Insert 5
Queue is full
Front index-> 0
Items ->
1 2 3 4 5
Rear index-> 4
1 Deleted
Front index-> 1
Items ->
2 3 4 5
Rear index-> 4
В примере выше мы реализовали структуру данных очередь в Java.
Совет
Чтобы узнать о работе очереди, посетите Структура данных Очередь.
Пример 2: Реализация очереди через интерфейс Queue
Java предоставляет встроенный интерфейс Queue, который можно использовать для реализации очереди.
import java.util.Queue;
import java.util.LinkedList;
class Main {
public static void main(String[] args) {
// создаём Queue с помощью класса LinkedList
Queue<Integer> numbers = new LinkedList<>();
// enqueue
// вставляем элемент в конец очереди
numbers.offer(1);
numbers.offer(2);
numbers.offer(3);
System.out.println("Queue: " + numbers);
// dequeue
// удаляем элемент из начала очереди
int removedNumber = numbers.poll();
System.out.println("Removed Element: " + removedNumber);
System.out.println("Queue after deletion: " + numbers);
}
}
Вывод:
Queue: [1, 2, 3]
Removed Element: 1
Queue after deletion: [2, 3]
В примере выше мы использовали интерфейс Queue, чтобы реализовать очередь в Java. Здесь мы использовали класс LinkedList, который реализует интерфейс Queue.
numbers.offer() — вставляет элементы в конец очереди
numbers.poll() — удаляет элемент из начала очереди
Обратите внимание: мы использовали угловые скобки <Integer> при создании очереди. Это означает, что очередь — обобщённого типа.
Мы также можем использовать другие интерфейсы и классы вместо Queue и LinkedList. Например:
Интерфейс Deque
Класс ArrayDeque
Класс PriorityQueue