队列和堆栈是一个广泛提到的结构。但是,在C ++中,对于队列,您可以通过两种方式执行此操作:
#include <queue>
#include <deque>
但是对于堆栈,你只能这样做
#include <stack>
我的问题是,队列和双端队列之间有什么区别,为什么提出两个结构?对于堆栈,可以包含任何其他结构吗?
答案 0 :(得分:60)
Moron / Aryabhatta是正确的,但更多细节可能会有所帮助。
队列和堆栈是比deque,vector或list更高级别的容器。通过这个,我的意思是你可以从较低级别的容器中构建一个队列或堆栈。
例如:
std::stack<int, std::deque<int> > s;
std::queue<double, std::list<double> > q;
使用deque作为底层容器和使用list作为底层容器的双精度队列构建一堆int。
您可以将s
视为受限制的双端空格,将q
视为限制列表。
所有必要的是低级容器实现更高级容器所需的方法。对于堆栈,这些是back()
,push_back()
和pop_back()
,对于队列,front()
,back()
,push_back()
和pop_front()
都是operator[]
。
关于双端队列,它不仅仅是一个可以在两端插入的队列。特别是,它具有随机访问push_front()
。这使它更像是一个向量,而是一个向量,您可以在其中插入和删除pop_front()
和{{1}}。
有关详细信息,请参阅deque。
答案 1 :(得分:37)
Queue
:您只能在一端插入并从另一端删除。
Deque
:您可以从两端插入和删除。
因此,使用Deque
,您可以为Queue
和Stack
建模。
提示:
Deque
是“ D ouble e nded que ue”的缩写。
答案 2 :(得分:30)
deque
是一个容器模板。它满足具有随机访问迭代器的序列的要求,非常类似于vector
。
queue
根本不是容器,它是适配器。它包含一个容器,并提供不同的,更具体的界面。如果您想要记住(或提醒)以避免除queue
和push[_back]
,pop[_front]
和front
,back
以及{之外的操作,请使用size
{1}}。除了第一个和最后一个之外,您无法查看empty
内的元素!
答案 3 :(得分:20)
在C ++库中,std::stack
和std::queue
都实现为容器适配器。这意味着它们分别提供堆栈或队列的接口,但它们本身都不是真正的容器。相反,他们使用其他容器(例如std::deque
或std::list
来实际存储数据),而std::stack
类只需要一小段代码来翻译push
和pop
至push_back
和pop_back
(以及std::queue
大致相同,但使用push_back
和pop_front
)。
答案 4 :(得分:5)
双端队列是一个双端队列,允许从任一端轻松插入/移除。队列只允许插入一端并从另一端检索。
答案 5 :(得分:4)
deque支持后面插入/弹出&amp;前
队列只支持插入后面,并从前面弹出。你知道,一个FIFO(先进先出)。
答案 6 :(得分:0)
deque是双头的。队列不是。
答案 7 :(得分:0)
Mike Anderson在这里:优先级队列出队根据某些排序(优先级)比较而不是排队顺序发生。
例如,您可以将定时事件存储在您想要首先提取最快事件并查询其预定时间的事件中,以便您可以睡到该时间点。
优先级队列通常使用堆来实现。
答案 8 :(得分:0)
在双端队列(双端队列)中,该元素可以从后面插入并从表单中删除(与堆栈相同),但在队列中只能从前面删除。