我正在用C ++做一些新手HackerRank问题,我发现似乎有几种方法可以解决这个问题,我想知道哪种方式使用最广泛和/或效率最高。该问题需要创建一个包含stack
和queue
变量以及stack_push
/ stack_pop
和queue_push
/ queue_pop
函数的类。
根据我的Google搜索,似乎我可以使用std::vector
,std::stack
和std::queue
,或std::deque
,也许还有其他人。
我不确定如何确定哪种方法最好用。有什么建议吗?
编辑:
我使用std::vector
实现了两者,然后使用std::stack
和std::queue
,我看到了与小型测试用例相同的精确性能。
EDIT2:
通过更大的测试用例,std:stack
/ std:queue
的效果优于std:vector
。我猜这是因为FIFO队列的一半对矢量效率不高,但我需要对此进行更多的测试。
答案 0 :(得分:2)
std::stack
使用std::deque
作为基础容器。 std::queue
也是如此。请参阅http://en.cppreference.com/w/cpp/container/stack和http://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::stack
或std::queue
而不会打扰底层细节。如果我需要采取更多控制措施,我会选择std::deque
。
答案 1 :(得分:1)
拇指规则首先确定您的所有要求,然后使用满足所有要求的最简单的数据结构。由于您没有搜索要求,最好的方法是实现C风格的链表。对于Stack,你只需要一个指向前面元素的指针,但是对于Queue,你必须保持2个指针来跟踪前面的元素以及最后一个元素。这可能是最快的实施。