如何在C++中使用单个堆栈实现队列

How to implement queue with a single stack in C++

在此 C++ 代码中,我使用单个 stack 实例实现 Queue。 我在 GeeksForGeeks 中找到了这段代码。 Url Here

#include <bits/stdc++.h>
using namespace std;
class Queue
{
private:
    stack<int> s;

public:
    void enque(int x)
    {
        s.push(x);
    }
    int deque()
    {
        if (s.empty())
        {
            cout << "Q is empty" << endl;
            return -1;
        }
        int x = s.top();
        s.pop();
        if (s.empty())
        {
            return x;
        }
        // I'm not able to understand these 3 lines after this comment
        int item = deque();
        s.push(x);
        return item;
    }
};
int main()
{
    Queue q;
    q.enque(1);
    q.enque(2);
    q.enque(3);
    cout << "Output: " << q.deque() << endl;
    cout << "Output: " << q.deque() << endl;
    cout << "Output: " << q.deque() << endl;
    cout << "Output: " << q.deque() << endl;
    return 0;
}

但是我看不懂这3行

int item = deque();
s.push(x);
return item;

Problem

在递归调用 deque() 之后,编译器如何到达下一行以再次将 x 压入堆栈。以及它如何在递归函数调用后保留 x 的值。

该代码并没有真正使用单个堆栈,而是通过对 deque 的递归调用将内置堆栈用作第二个堆栈。代码相当于:

#include <iostream>
#include <stack>

class Queue
{
private:
    std::stack<int> s;

public:
    void enque(int x)
    {
        s.push(x);
    }
    int deque()
    {
        if (s.empty())
        {
            std::cout << "Q is empty\n";
            return -1;
        }
        std::stack<int> temp;
        while (s.size() != 1)
        {
            temp.push(s.top());
            s.pop();
        }
        int result = s.top();
        s.pop();
        while (!temp.empty())
        {
            s.push(temp.top());
            temp.pop();
        }
        return result;
    }
};
int main()
{
    Queue q;
    q.enque(1);
    q.enque(2);
    q.enque(3);
    std::cout << "Output: " << q.deque() << "\n";
    std::cout << "Output: " << q.deque() << "\n";
    std::cout << "Output: " << q.deque() << "\n";
    std::cout << "Output: " << q.deque() << "\n";
    return 0;
}

我想不出你以这种方式实现队列的原因,随着队列大小的增长 deque 变得越来越昂贵,使用你最终会得到的原始代码堆栈溢出。如果您需要队列,请使用 std::queue or std::deque(默认情况下 std::queue 只是一个包装轮 std::deque,它隐藏了 push_front/pop_back 方法)