比较队列和堆栈的内容

时间:2013-03-02 16:52:35

标签: c++ recursion stack queue equality

假设我们在c ++中使用STL Stack和Queue

    Stack:      [1 2 3 4 5] <=>
    Queue:   => [5 4 3 2 1] =>

以递归方式检查数据条目在内容和顺序方面是否相同的最优雅方法是什么?假设上面显示的堆栈和队列具有相同的数据和相同的顺序。

我在概念上理解要做什么,因为数据pop()的顺序相反。

4 个答案:

答案 0 :(得分:0)

部分递归的解决方案是递归地弹出辅助堆栈中队列中的所有元素,然后检查辅助堆栈和原始堆栈是否相同。这项检查也可以递归完成。

答案 1 :(得分:0)

不需要递归,这将是无用的浪费资源。无需改变您的queuestack(换句话说,这甚至可以在const上发挥作用)。

假设您的std::stackstd::queue在内部使用相同类型的基础容器(如果您使用默认值,则应为std::dequeue),那么您可以访问受保护的成员{{1 ({1}}和c的{​​真实容器}并使用运算符queue进行比较:

stack

现在,如果您使用不同的容器类型作为==#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技术来获取按相同顺序排序的容器:stackgetContainer()都会调用基础容器的queue::push()方法,只有在stack::push()(和类似操作)push_back()发生逆转时才会这样做。由于这些底层容器的顺序相同,因此您可以更轻松地比较事物(作为练习留给读者;)。

信用:我懒得再次重新实现受保护的成员访问者,所以我无耻地复制和修改了this one

答案 2 :(得分:0)

如果通过递归,你不是指递归函数调用,而只是循环,那么这是一个答案。该函数首先检查堆栈和队列是否大小相同。如果它们的大小不同,则该函数返回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;
}

答案 3 :(得分:0)

你可能不会同时弹出它们,你可以尝试弹出一个(使用记录它的东西)ADT(不要弹出队列,弹出堆栈)和基础(大小== 1),你比较并做了一些改变到队列,并返回。然后在每次递归调用后对记录器和当前队列的前端执行某些操作,您将找到答案。