Как реализация java.util.queue использует LIFO? - PullRequest
10 голосов
/ 26 июля 2011

В Java doc:

[...] Среди исключений есть очереди с приоритетами, которые упорядочивают элементы в соответствии с предоставленным компаратором, или естественное упорядочение элементов, и очереди LIFO (или стеки)) которые упорядочивают элементы LIFO (последний пришел-первый вышел)

Как реализация java.util.queue использует LIFO вместо FIFO ?

Ответы [ 6 ]

19 голосов
/ 30 июля 2013

Вы можете использовать любой Deque в качестве очереди LIFO, используя метод Collections.asLifoQueue:

Queue<Integer> arrayLifoQueue = Collections.asLifoQueue(new ArrayDeque<Integer>());
Queue<Integer> linkedListLifoQueue = Collections.asLifoQueue(new LinkedList<Integer>());
9 голосов
/ 26 июля 2011

Вы можете использовать java.util.LinkedList и использовать методы pop() и push() и использовать их как стек, который является очередью LIFO.

4 голосов
/ 26 июля 2011

Stack и LinkedList, предлагаемые здесь, являются просто коллекциями. Очередь не является коллекцией. Он является частью пакета для параллелизма и может использоваться с пулами потоков.

Я только что подтвердил еще раз и прочитал Javadoc, который вы цитировали. Я думаю, что единственный вариант использовать очередь LIFO - это использовать очередь приоритетов с пользовательским компаратором, который сравнивает элементы по времени вставки в обратном порядке.

3 голосов
/ 26 июля 2011

Deque можно использовать как LIFO или FIFO

2 голосов
/ 25 ноября 2018

Реализация очереди может основываться на FIFO , приоритетов и LIFO - так говорится в официальной документации.

Когда программист впервые видит « Очередь », он автоматически думает: « это должен быть порядок FIFO » ( или, в конечном итоге, приоритетный заказ ).Но, как говорится в документации, должна быть возможность использовать интерфейс очереди для упорядочения LIFO.Позвольте мне объяснить вам, как это можно сделать.

// FIFO queue usage
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);

queue.remove(); // returns 1
queue.remove(); // returns 2

// LIFO queue usage
Queue<Integer> queue = Collections.asLifoQueue(new ArrayDeque<>());
queue.add(1);
queue.add(2);

queue.remove(); // returns 2
queue.remove(); // returns 1

Как вы можете видеть в зависимости от реализации, интерфейс очереди можно использовать также как LIFO.

2 голосов
/ 26 июля 2011

Очередь - это структура данных, в которой используется метод «первым пришел-первым вышел».

Вот полезная ссылка: magi.toolkit.util.queue Class LIFOQueue

Реализация очереди «Last In, First Out».По сути, очередь LIFO - это стек.

...