Как использовать очередь и стек
Короткий ответ
ArrayDeque работает и как очередь (первым пришёл — первым ушёл), и как стек (последним пришёл — первым ушёл):
void main() {
Deque<String> queue = new ArrayDeque<>();
queue.offer("Anna");
queue.offer("Oleg");
IO.println(queue.poll());
Deque<String> stack = new ArrayDeque<>();
stack.push("page1");
stack.push("page2");
IO.println(stack.pop());
}Результат:
Anna
page2Посмотреть без удаления
peek() возвращает следующий элемент, но оставляет его на месте. Для пустой очереди peek() и poll() возвращают null:
void main() {
Deque<Integer> queue = new ArrayDeque<>(List.of(1, 2));
IO.println(queue.peek());
IO.println(queue.size());
queue.clear();
IO.println(queue.poll());
}Результат:
1
2
nullОчередь с приоритетом
PriorityQueue всегда выдаёт наименьший элемент — или наиболее важный по вашему компаратору:
record Task(String title, int priority) {}
void main() {
var tasks = new PriorityQueue<>(Comparator.comparingInt(Task::priority));
tasks.add(new Task("write tests", 2));
tasks.add(new Task("fix bug", 1));
tasks.add(new Task("refactor", 3));
while (!tasks.isEmpty()) {
IO.println(tasks.poll().title());
}
}Результат:
fix bug
write tests
refactorЧастая ошибка
Вызывать pop() или remove() у пустой очереди. В отличие от poll(), они выбрасывают исключение:
void main() {
Deque<String> stack = new ArrayDeque<>();
stack.pop();
}Результат:
Exception in thread "main" java.util.NoSuchElementExceptionСтарый класс Stack синхронизирован и медленнее — в новом коде используйте ArrayDeque.
Функции из этого ответа
- ArrayDeque — Быстрая двусторонняя очередь на массиве — замена `Stack` и `LinkedList`.
- Deque.push() — Кладёт элемент на вершину стека (в начало двусторонней очереди).
- Queue.poll() — Забирает и удаляет первый элемент очереди.
- PriorityQueue — Очередь, которая всегда выдаёт наименьший (или самый приоритетный) элемент.