стек очереди в C++ двухсторонняя очередь против против
очередь и стек являются широко упомянутыми структурами. Однако, в C++, по очереди, вы можете сделать это двумя способами:
#include <queue>
#include <deque>
но для стека вы можете сделать это только так
#include <stack>
мой вопрос в том, в чем разница между queue и deque, почему предлагаются две структуры? Для стека, любая другая структура может быть включена?
8 ответов:
Moron / Aryabhatta правильно, но немного больше деталей может быть полезно.
очередь и стек-это контейнеры более высокого уровня, чем deque, vector или list. Под этим я подразумеваю, что вы можете построить очередь или стек из контейнеров более низкого уровня.
например:
std::stack<int, std::deque<int> > s; std::queue<double, std::list<double> > q;
будет построить стек из целых чисел с помощью двухсторонней очереди в качестве базового контейнера и очереди увеличатся, используя список в качестве базового контейнера.
вы можете думать о
s
ограниченные deque иq
как ограниченный список.все, что необходимо, это то, что контейнер нижнего уровня реализует методы, необходимые контейнеру более высокого уровня. Это
back()
,push_back()
иpop_back()
для стека иfront()
,back()
,push_back()
иpop_front()
для очереди.посмотреть стек и очереди подробнее.
что касается дека, это гораздо больше, чем очередь, где вы можете вставить с обоих концов. В частности, он имеет произвольный доступ
operator[]
. Это делает его более похожим на вектор, но вектор, где вы можете вставить и удалить в начале сpush_front()
иpop_front()
.посмотреть deque для детали.
очередь: вы можете вставить только в один конец и удалить из другого.
Дека: вы можете вставить и удалить с обоих концов.
таким образом, используя Deque, вы можете моделировать очередь, а также стек.
deque
- это шаблон контейнера. Он удовлетворяет требованиям для последовательности с итераторами произвольного доступа, так же как иvector
.
queue
это вообще не контейнер, это адаптер. Он содержит контейнер и предоставляет другой, более конкретный интерфейс. Используйтеqueue
когда вы хотите вспомнить (или напомнить), чтобы избежать операции, кромеpush[_back]
иpop[_front]
,front
иback
,size
иempty
. Вы не можете смотреть на элементы внутриqueue
кроме первого и последнего, на все!
в библиотеке C++, как
std::stack
иstd::queue
реализуются как контейнер переходник. Это означает, что они обеспечивают интерфейс стека или очереди соответственно, но ни один из них не является контейнером сам по себе. Вместо этого они используют какой-то другой контейнер (напримерstd::deque
илиstd::list
на самом деле хранить данные), иstd::stack
класс просто имеет немного кода для переводаpush
иpop
доpush_back
иpop_back
(иstd::queue
делает примерно то же самое, но с использованиемpush_back
иpop_front
).
deque-это двусторонняя очередь, которая позволяет легко вставлять/удалять с любого конца. Очереди позволяют только вставку в одном конце и извлечение из другого.
дека поддерживает вставить/поп со спины и спереди
очередь поддерживает только вставку в спину и поп спереди. Вы знаете, FIFO (первый в первый выход).
приоритет очереди dequeue происходит в соответствии с некоторым упорядочением (приоритет) сравнения не порядок очереди.
например, вы можете хранить синхронизированные события в том, где вы хотите сначала вытащить самое раннее событие и запросить его запланированное время, чтобы вы могли спать до этого момента времени.
приоритетные очереди часто реализуются с помощью куч.