C ++队列与队列


81

队列和堆栈是被广泛提及的结构。但是,在C ++中,对于队列,您可以通过两种方式进行:

#include <queue>
#include <deque>

但是对于堆栈,您只能这样做

#include <stack>

我的问题是,队列和双端队列有什么区别,为什么要提出两种结构?对于堆栈,可以包括任何其他结构吗?

Answers:


77

Moron / Aryabhatta是正确的,但多一点细节可能会有所帮助。

队列和堆栈是比双端队列,向量或列表更高级别的容器。我的意思是,您可以在低层容器中建立队列或堆栈。

例如:

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

将使用双端队列作为基础容器构建一个int堆栈,并使用一个列表作为基础容器构建一个double队列。

您可以将其s视为受限双端队列和q受限列表。

所有必要的是较低级别的容器实现较高级别的容器所需的方法。这些back()push_back()pop_back()堆栈和front()back()push_back(),和pop_front()队列。

有关更多详细信息,请参见堆栈队列

关于双端队列,它不仅是可以在两端插入的队列。特别是,它具有随机访问权限operator[]。这使其更像一个向量,但它是一个向量,您可以在其中以push_front()and开头插入和删除pop_front()

有关详细信息,请参见双端队列


15
stackqueue 限制 deque其全部功能。
bobobobo

59

Queue:您只能在一端插入,而从另一端移开。

Deque:您可以从两端插入和移除。

因此,使用一个Deque,你可以模拟Queue以及一个Stack

提示:
Deque是短期的“ d ouble ê ndedUE”。


4
如果您使用双端队列对堆栈进行建模,会不会过大?
skydoor 2010年

您无法使用队列为堆栈建模。
R Samuel Klatchko

1
还有很多不同之处。queue不满足容器的要求。为了天堂,它没有迭代器!
Potatoswatter 2010年

@skydoor在所有标准库容器中,双端队列可以说是开销最低的容器。

3
@skydoor:就像FYI一样,默认情况下,STLstd::stack使用astd::deque作为后备容器。我在这里推测原因:stackoverflow.com/questions/102459/…(基本上,增长adeque的开销很低)。
Michael Burr 2010年

32

deque是一个容器模板。它满足了对具有随机访问迭代器(类似于)的序列的要求vector

queue根本不是一个容器,它是一个适配器。它包含一个容器,并提供一个不同的,更特定的接口。使用queue时,你要记住(或提醒),以避免操作之外push[_back]pop[_front]frontbacksizeemptyqueue除了第一个和最后一个,您根本看不到元素!


7
适配器-换句话说不必要的功能crippler,但适配器就好了
bobobobo

22

在C ++库中,std::stackstd::queue都实现为容器适配器。这意味着它们分别提供堆栈或队列的接口,但它们本身都不是容器。取而代之的是,他们使用其他一些容器(例如std::dequestd::list实际存储数据),并且std::stack该类仅具有少量代码即可转换pushpoppush_back和转换pop_back(并且std::queue大致相同,但使用push_backand pop_front)。


对于queue,VS似乎也映射poppop_front,而pushpush_back了,所以我想这是实现相关。
chappjc 2015年

@chappjc:不,重新检查,只是我的记忆消失了。pop_frontpush_back有什么要求。我很抱歉。
杰里·科芬

7

双端队列是双端队列,它允许从任一端轻松插入/删除。队列仅允许插入一端并从另一端检索。


5

双端队列支持从背面和正面插入/弹出

队列仅支持向后插入,并从前面弹出。您知道,FIFO(先进先出)。



0

在双端队列(双端队列)中,可以从后插入元素并从后移形式删除(与堆栈相同),但是在队列中,只能从前移出元素。


这个答案并没有给这个话题添加任何新内容(并且大多数答案来自2010年)
barbsan

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.