Получить доступ

Чем очередь (FIFO) отличается от стека (LIFO)?

JuniorКоллекции
Ещё спрашивают так:
  • Чем Queue отличается от Deque?
  • Почему не стоит использовать класс Stack?
  • Какую структуру взять для очереди в Java?
Коротко

Очередь (FIFO) отдаёт элементы в порядке поступления, стек (LIFO) — начиная с последнего добавленного.

  • В Java оба удобно реализует ArrayDeque: offer/poll — очередь, push/pop — стек
  • Класс Stack устарел: синхронизирован и наследует Vector

А ещё Для приоритетов — PriorityQueue, она отдаёт по порядку сортировки, а не FIFO

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Очередь — первым пришёл, первым ушёл: обработка задач по порядку, обход графа в ширину. Стек — последним пришёл, первым ушёл: отмена действий, обход в глубину, разбор скобок.

В современной Java обе структуры реализует ArrayDeque — двусторонняя очередь на кольцевом массиве. Она добавляет и снимает элементы с обоих концов за O(1):

  • как очередь: offer / poll / peek;
  • как стек: push / pop / peek.

Старый класс Stack использовать не рекомендуют: он синхронизирован без необходимости (медленнее) и наследует Vector, поэтому наружу «протекают» операции по индексу, которые ломают идею стека. LinkedList тоже реализует Deque, но обычно медленнее ArrayDeque.

Отдельно: PriorityQueue — не FIFO, она отдаёт наименьший элемент по сравнению (двоичная куча, O(log n)). Для многопоточной работы есть блокирующие очереди: ArrayBlockingQueue, LinkedBlockingQueue.

Пример

Deque<Integer> stack = new ArrayDeque<>();
stack.push(1); stack.push(2);
stack.pop();                 // 2

Queue<Integer> queue = new ArrayDeque<>();
queue.offer(1); queue.offer(2);
queue.poll();                // 1

Что хотят услышать

  • Определения FIFO и LIFO с примерами применения.
  • ArrayDeque как реализация обоих.
  • Почему не Stack.
  • PriorityQueue и блокирующие очереди — плюс.

Частые ошибки

  • Использовать устаревший класс стека в новом коде.
  • Ожидать порядка поступления от очереди с приоритетом.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Очередь отдаёт элементы в порядке поступления, стек — начиная с последнего добавленного
  • ✗Очередь хранит только числа, стек — любые объекты
  • ✗Очередь имеет ограниченный размер, стек — нет
  • ✗Очередь отсортирована, стек — нет

Что спросят дальше

  • Почему двусторонняя очередь обычно быстрее связного списка?
  • В каком порядке обходит элементы очередь с приоритетом?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем