c ++ dequevsキューvsスタック


82

キューとスタックは広く言及されている構造です。ただし、C ++では、キューの場合、次の2つの方法で実行できます。

#include <queue>
#include <deque>

しかし、スタックの場合は、このようにすることしかできません

#include <stack>

私の質問は、キューと両端キューの違いは何ですか、なぜ2つの構造が提案されたのですか?スタックの場合、他の構造を含めることができますか?

回答:


77

モロン/アーリヤバタは正しいですが、もう少し詳細が役立つかもしれません。

キューとスタックは、deque、vector、またはlistよりも高レベルのコンテナーです。これは、下位レベルのコンテナからキューまたはスタックを構築できることを意味します。

例えば:

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

基になるコンテナとしてdequeを使用してintのスタックを構築し、基になるコンテナとしてリストを使用してdoubleのキューを構築します。

s制限された両端キューおよびq制限されたリストと考えることができます。

必要なのは、下位レベルのコンテナが上位レベルのコンテナに必要なメソッドを実装することだけです。これらはback()push_back()、およびpop_back()スタック用とfront()back()push_back()、およびpop_front()キューの。

詳細については、スタックキューを参照してください。

dequeに関しては、両端に挿入できるキュー以上のものです。特に、ランダムアクセスがありますoperator[]。これにより、ベクトルのようになりますが、最初にpush_front()とで挿入および削除できるベクトルになりますpop_front()

詳細については、dequeを参照してください。


16
stackそしてqueue ちょうど制限 dequeの完全な機能セットから。
bobobobo 2013

59

Queue:一方の端にのみ挿入し、もう一方の端から取り外すことができます。

Deque:両端から出し入れできます。

使用するのでDeque、あなたは、モデル化できるQueueだけでなく、Stack

ヒント:
Deque"の略であるD ouble電子nded QUE UE"。


4
Dequeを使用してスタックをモデル化する場合、それはやり過ぎではありませんか?
skydoor 2010

キューを使用してスタックをモデル化することはできません。
R Samuel Klatchko 2010

1
もっとたくさんの違いがあります。queueコンテナの要件を満たしていません。天国のために、イテレータはありません!
ポテトスワッター2010

@skydoorすべての標準ライブラリコンテナの中で、dequeは間違いなくオーバーヘッドが最も少ないものです。

3
@skydoor:参考までに、STLstd::stackstd::dequeデフォルトでバッキングコンテナとしてを使用します。私はここで理由を推測します:stackoverflow.com/questions/102459/…(基本的に、成長することdequeは低いオーバーヘッドです)。
Michael Burr

33

dequeコンテナテンプレートです。これは、のように、ランダムアクセスイテレータを使用するシーケンスの要件を満たしますvector

queueコンテナではなく、アダプタです。コンテナが含まれ、別のより具体的なインターフェイスを提供します。使用queue以外の操作を避けるために、あなたは覚えている(または思い出させる)したいpush[_back]pop[_front]frontbacksizeemptyqueue最初と最後以外の内部の要素はまったく見ることができません!


7
アダプター-言い換えれば、不要な機能の不自由な人ですが、アダプターは問題ありません
bobobobo 2013

22

C ++ライブラリでは、両方std::stackstd::queueコンテナとして実装されているアダプタ。つまり、それぞれスタックまたはキューのインターフェイスを提供しますが、どちらも実際にはそれ自体がコンテナではありません。代わりに、彼らは他のいくつかのコンテナを使用する(例えばstd::dequeまたはstd::list、実際にデータを保存するため)、およびstd::stackクラスだけで変換するコードのほんの少しを持っているpushpopするpush_backpop_back(とstd::queueほぼ同じ処理を行いますが、使用push_backしてpop_front)。


以下のためにqueue、VSもマップようだpoppop_front、とpushするpush_back私は、これは実装に依存していると思いますので、。
chappjc 2015

@chappjc:いいえ、再確認しました。メモリがオフになっているだけです。pop_frontそしてpush_back必要なものです。謝罪いたします。
ジェリーコフィン

7

dequeは両端キューであり、どちらの端からでも簡単に挿入/削除できます。キューでは、一方の端に挿入し、もう一方の端から取得することしかできません。


5

dequeは、背面と前面からの挿入/ポップをサポートします

キューは、背面への挿入と前面からのポップのみをサポートします。ご存知のとおり、FIFO(先入れ先出し)。



0

優先キューのデキューは、エンキューの順序ではなく、いくつかの順序(優先)の比較に従って行われます。

たとえば、時間指定されたイベントを、最も早いイベントを最初に引き出し、そのスケジュールされた時間をクエリして、その時点までスリープできるようにする場合があります。

優先キューは、多くの場合、ヒープを使用して実装されます。

マイクアンダーソンによってここに:https
//www.quora.com/What-is-the-difference-between-a-priority-queue-and-a-queue


0

In deque(両端キュー)要素は後ろから挿入してフォームを後ろから削除できます(スタックと同じ)が、キューでは前からのみ削除します。


この回答は、トピックに何か新しいものを追加しない(と回答のほとんどは、2010年からのもの)
barbsan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.