Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как использовать очередь и стек

Короткий ответ

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 — Очередь, которая всегда выдаёт наименьший (или самый приоритетный) элемент.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.