哪种数据结构最适合C ++中的基本堆栈和队列?

时间:2016-04-22 19:31:22

标签: c++ class stack queue deque

我正在用C ++做一些新手HackerRank问题,我发现似乎有几种方法可以解决这个问题,我想知道哪种方式使用最广泛和/或效率最高。该问题需要创建一个包含stackqueue变量以及stack_push / stack_popqueue_push / queue_pop函数的类。

根据我的Google搜索,似乎我可以使用std::vectorstd::stackstd::queue,或std::deque,也许还有其他人。

我不确定如何确定哪种方法最好用。有什么建议吗?

编辑: 我使用std::vector实现了两者,然后使用std::stackstd::queue,我看到了与小型测试用例相同的精确性能。 EDIT2:  通过更大的测试用例,std:stack / std:queue的效果优于std:vector。我猜这是因为FIFO队列的一半对矢量效率不高,但我需要对此进行更多的测试。

2 个答案:

答案 0 :(得分:2)

std::stack使用std::deque作为基础容器。 std::queue也是如此。请参阅http://en.cppreference.com/w/cpp/container/stackhttp://en.cppreference.com/w/cpp/container/queue

来自引用页面

template<
    class T,
    class Container = std::deque<T>
> class stack;
  

Container - 用于存储的基础容器的类型   元素。容器必须满足要求   SequenceContainer。此外,它必须提供以下内容   具有通常语义的函数:back()push_back()pop_back()   标准容器std :: vector,std :: deque和std :: list满足   这些要求。

如果情况允许,我会使用std::stackstd::queue而不会打扰底层细节。如果我需要采取更多控制措施,我会选择std::deque

答案 1 :(得分:1)

拇指规则首先确定您的所有要求,然后使用满足所有要求的最简单的数据结构。由于您没有搜索要求,最好的方法是实现C风格的链表。对于Stack,你只需要一个指向前面元素的指针,但是对于Queue,你必须保持2个指针来跟踪前面的元素以及最后一个元素。这可能是最快的实施。