比较队列和堆栈的内容
Compare a Queue and a Stack's content
假设我们在c++中使用STL堆栈和队列
Stack: [1 2 3 4 5] <=>
Queue: => [5 4 3 2 1] =>
递归检查数据条目在内容和顺序方面是否相同的最优雅的方法是什么?假设上面显示的堆栈和队列具有相同的数据和相同的顺序。
我在概念上理解该怎么做有问题,因为数据pop()以相反的顺序。
部分递归的解决方案是递归地从辅助堆栈中取出队列中的所有元素,然后检查辅助堆栈和原始堆栈是否相同。
不需要递归,这将是无用的资源浪费。不需要改变你的queue
和stack
(换句话说,这甚至适用于const
)。
假设您的std::stack
和std::queue
都在内部使用相同类型的底层容器(如果您使用默认值,则应该是std::dequeue
),那么您可以访问queue
和stack
的受保护成员c
(您的实际容器),并使用操作符==
进行比较:
#include <iostream>
#include <queue>
#include <stack>
template<typename Adapter>
typename Adapter::container_type const& getContainer(const Adapter& adapter) {
struct AccessProtected : private Adapter {
static typename Adapter::container_type const& getContainer(const Adapter& adapter) { return adapter.*&AccessProtected::c; }
};
return AccessProtected::getContainer(adapter);
}
int main() {
std::queue<int> queue;
std::stack<int> stack;
for (int i = 0; i < 10; ++i) {
queue.push(i);
stack.push(i);
}
std::cout << (getContainer(queue) == getContainer(stack) ? "equal" : "not equal") << std::endl;
return 0;
}
现在,如果您使用不同的容器类型作为queue
和stack
的底层实现,您仍然可以使用相同的getContainer()
技术来获得以相同顺序排序的容器:queue::push()
和stack::push()
都调用底层容器的push_back()
方法,只有当您使用pop()
(以及类似的操作)时,才会对stack
发生反转。由于这些底层容器将以相同的顺序排列,因此可以更容易地进行比较(留给读者作为练习;))。
我懒得再重新实现一个受保护的成员访问器,所以我无耻地复制和修改了这个。
如果递归不是指递归函数调用,而只是循环,那么这里有一个答案。该函数首先检查堆栈和队列的大小是否相同。如果它们的大小不同,则函数返回false。该函数有一个获取堆栈参数元素的本地堆栈对象,以便以与传入的堆栈参数相反的顺序弹出。然后循环检查堆栈和队列的每个前/顶元素是否相等。如果相等,则循环继续进行下一次迭代。如果不相等,函数返回false。如果循环结束而未返回false,则该函数返回true。
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
bool check(stack<int> stackPar, queue<int> queuePar)
{
if (stackPar.size() != queuePar.size())
{
return false;
}
stack<int> reverseStack;
for (int i = 0, initialSize = stackPar.size(); i < initialSize; ++i)
{
reverseStack.push(stackPar.top());
stackPar.pop();
}
for (int i = 0; i < reverseStack.size(); ++i)
{
if (reverseStack.top() == queuePar.front())
{
reverseStack.pop();
queuePar.pop();
}
else
{
return false;
}
}
return true;
}
int main()
{
stack<int> myStack;
queue<int> myQueue;
for(int i = 1; i <= 5; ++i)
{
myStack.push(i);
myQueue.push(i);
}
cout << "Stack and queue are ";
cout << ( check(myStack, myQueue) ? "equal." : "not equal." ) << endl;
return 0;
}
你可能不会同时弹出它们,你可以尝试弹出一个(使用一些记录它)ADT(不弹出队列,弹出堆栈),并到基(size==1),然后你比较并对队列进行一些更改,并返回。然后在每次递归调用之后对记录器和当前队列的前端执行一些操作,您将找到答案。
- 堆栈和队列是否像C++中的数组一样传递?
- 了解使用堆栈实现队列的递归调用机制
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 嵌套容器:为什么我无法访问堆栈队列顶部的堆栈?C++
- 堆栈和队列的C++默认实现
- 前缀表示法 C++,分段错误(堆栈和队列)
- 将元素从队列复制到堆栈
- 具有父类和虚拟函数的堆栈和队列
- 在C++中使用队列和堆栈对 2 个向量进行加减
- 在堆或堆栈上分配的 std::队列的内存
- 使用提升库在队列和堆栈数据结构上保存和加载数据时出错
- 尝试使用堆栈创建队列.为什么我会遇到int转换错误的空白
- 堆栈,队列延迟
- 将双重链接列表与C 中的堆栈和队列类链接
- 堆栈和队列在 Dev-C++ 中给出错误
- 根据堆栈类实现队列类的复制构造函数
- 过度填充堆栈和队列容量(C )
- 堆栈/队列 C++ 中的内存泄漏
- 使用C++堆栈/队列分析XML文件
- 什么是堆栈?arrayStack ?arrayQueue ?堆栈队列 ?它们在C++上有何不同