Чем очередь (FIFO) отличается от стека (LIFO)?
- Чем Queue отличается от Deque?
- Почему не стоит использовать класс Stack?
- Какую структуру взять для очереди в Java?
Очередь (FIFO) отдаёт элементы в порядке поступления, стек (LIFO) — начиная с последнего добавленного.
- В Java оба удобно реализует ArrayDeque: offer/poll — очередь, push/pop — стек
- Класс Stack устарел: синхронизирован и наследует Vector
А ещё Для приоритетов — PriorityQueue, она отдаёт по порядку сортировки, а не FIFO
Подробно
Очередь — первым пришёл, первым ушёл: обработка задач по порядку, обход графа в ширину. Стек — последним пришёл, первым ушёл: отмена действий, обход в глубину, разбор скобок.
В современной 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 и блокирующие очереди — плюс.
Частые ошибки
- Использовать устаревший класс стека в новом коде.
- Ожидать порядка поступления от очереди с приоритетом.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Очередь хранит только числа, стек — любые объекты
- ✓Очередь отдаёт первым пришедший, стек — последний
- ✗Очередь имеет ограниченный размер, а стек растёт без ограничений
- ✗Очередь отсортирована, стек — нет
Что спросят дальше
- Почему двусторонняя очередь обычно быстрее связного списка?
- В каком порядке обходит элементы очередь с приоритетом?
Разбор темы
- Очереди и стек: ArrayDeque и PriorityQueue
ArrayDeque как кольцевой буфер и замена Stack, PriorityQueue как бинарная куча и её неотсортированная итерация.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.