Подтвердить что ты не робот

С++ deque vs queue vs stack

Очередь и стек - это широко известные структуры. Однако в С++ для очереди вы можете сделать это двумя способами:

#include <queue>
#include <deque>

но для стека вы можете делать это только так:

#include <stack>

Мой вопрос в том, какая разница между очередью и deque, почему предлагались две структуры? Для стека может быть включена любая другая структура?

4b9b3361

Ответ 1

Морон/Арьябхатта верны, но могут быть полезны немного больше деталей.

Очередь и стек являются контейнерами более высокого уровня, чем deque, vector или list. Под этим я подразумеваю, что вы можете построить очередь или стек из контейнеров более низкого уровня.

Например:

  std::stack<int, std::deque<int> > s;
  std::queue<double, std::list<double> > q;

Построит стек целых чисел, используя deque в качестве основного контейнера и очередь двойников, используя список в качестве основного контейнера.

Вы можете думать о s как о закрытой деке, а о q как о запрещенном списке.

Все, что необходимо, это то, что контейнер нижнего уровня реализует методы, необходимые для контейнера более высокого уровня. Это back(), push_back() и pop_back() для стека и front(), back(), push_back() и pop_front() для очереди.

Смотрите стек и очередь для более подробной информации.

Что касается deque, это гораздо больше, чем очередь, куда вы можете вставить на обоих концах. В частности, у него есть operator[] произвольного доступа operator[]. Это делает его больше похожим на вектор, но на вектор, куда вы можете вставлять и удалять в начале с помощью push_front() и pop_front().

Смотрите deque для деталей.

Ответ 2

Queue: вы можете вставить только в один конец и удалить из другого.

Deque: вы можете вставить и удалить с обоих концов.

Таким образом, используя Deque, вы можете моделировать Queue а также Stack.

Подсказка:
Deque является аббревиатурой "D ouble е nded дие у.е".

Ответ 3

deque - это шаблон контейнера. Он удовлетворяет требованиям для последовательности с итераторами с произвольным доступом, как и vector.

queue не является контейнером вообще, это адаптер. Он содержит контейнер и предоставляет другой, более конкретный интерфейс. Используйте queue, если вы хотите запомнить (или напомнить), чтобы избежать операций, кроме push[_back] и pop[_front], front и back, size и empty. Вы не можете смотреть элементы внутри queue, кроме первого и последнего, вообще!

Ответ 4

В библиотеке С++ как std::stack, так и std::queue реализованы как контейнерные адаптеры. Это означает, что они обеспечивают интерфейс стека или очереди соответственно, но ни один из них сам по себе не является контейнером. Вместо этого они используют какой-то другой контейнер (например, std::deque или std::list для фактического хранения данных), а класс std::stack имеет крошечный бит кода для перевода push и pop в push_back и pop_backstd::queue делает примерно то же самое, но использует push_back и pop_front).

Ответ 5

Deque - это двойная очередь, которая позволяет легко вставлять/удалять с любого конца. Очереди допускают только вставку в один конец и извлечение из другого.

Ответ 6

deque поддерживает вставку/поп с обратной стороны и спереди

очередь поддерживает только вставку в спину и поп с фронта. Вы знаете, FIFO (сначала первый).

Ответ 7

Дека двойная. Очередь отсутствует.

Ответ 8

Приоритет очереди очереди происходит в соответствии с некоторым порядком (приоритетом) сравнения, а не порядком очереди.

Например, вы можете хранить синхронизированные события в том, где вы хотите сначала извлечь самое быстрое событие и запросить его запланированное время, чтобы вы могли спать до этого момента времени.

Приоритетные очереди часто реализуются с использованием кучи.

Майк Андерсон здесь:
https://www.quora.com/What-is-the-difference-between-a-priority-queue-and-a-queue

Ответ 9

В режиме deque (двусторонняя очередь) Элемент можно вставить сзади и удалить форму назад (То же, что в стеке), но в очереди удалить только спереди.