繁体   English   中英

c++ deque vs queue vs stack

[英]c++ deque vs queue vs stack

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

#include <queue>
#include <deque>

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

#include <stack>

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

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

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

例如:

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

将使用双端队列作为底层容器构建一个整数栈,并使用列表作为底层容器构建一个双精度队列。

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

所需要的只是较低级别的容器实现较高级别容器所需的方法。 它们是back()push_back()pop_back()用于堆栈,而front()back()push_back()pop_front()用于队列。

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

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

有关详细信息,请参阅deque

Queue :您只能在一端插入并从另一端删除。

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

因此,使用Deque ,您可以对QueueStack建模。

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

deque是一个容器模板。 它满足具有随机访问迭代器的序列的要求,很像vector

queue根本不是一个容器,它是一个适配器 它包含一个容器并提供不同的、更具体的界面。 当您想记住(或提醒)时使用queue以避免除了push[_back]pop[_front]frontbacksizeempty 除了第一个和最后一个之外,您根本无法查看queue中的元素!

在 C++ 库中, std::stackstd::queue都被实现为容器适配器 这意味着它们分别提供了堆栈或队列的接口,但它们本身都不是真正的容器。 相反,他们使用其他一些容器(例如std::dequestd::list来实际存储数据),而std::stack类只有pop_back代码将pushpop转换为push_backpop_back (以及std::queue大致相同,但使用push_backpop_front )。

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

deque 支持前后插入/弹出

queue 只支持插入到后面,从前面弹出。 您知道,FIFO(先进先出)。

双端队列是双端的。 队列不是。

优先队列出队是根据某种排序(优先级)比较而不是入队顺序发生的。

例如,您可能将定时事件存储在一个您想首先提取最快的事件并查询其预定时间的位置,以便您可以在该时间点之前睡觉。

优先级队列通常使用堆来实现。

迈克·安德森在这里:
https://www.quora.com/What-is-the-difference-between-a-priority-queue-and-a-queue

在 deque(双端队列)中,元素可以从后面插入,从后面移除(就像在堆栈中一样),但队列只允许从前面移除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM