C++利用栈实现队列、利用队列实现栈

1.利用栈来实现队列

//利用栈实现队列
//关键点:利用临时栈将新元素放在原始栈的栈底,从而实现后进后出
#include<iostream>
#include<stack>
using namespace std;
class MyQueue
{
public:
    void push(const int& x) {
        stack<int>temp_stack;
        //假设_data的元素为[1,2,3,4],1所在位置为栈顶,
        //要想实现新元素的后进后出,需要将x放在栈底,即[1,2,3,4,x];

        //将原栈里的元素次序反转,即此时临时栈temp_stack为[4,3,2,1]
        //4所在位置为栈顶
        while (!_data.empty()) {
            temp_stack.push(_data.top());
            _data.pop();
        }
        //将新元素放在栈顶,此时临时栈temp_stack为[x,4,3,2,1]
        temp_stack.push(x);
        //再次反转临时栈里的元素的次序,此时栈_data为[1,2,3,4,x]
        //新元素x被放在栈底,从而实现了,x后进后出
        while (!temp_stack.empty())
        {
            _data.push(temp_stack.top());
            temp_stack.pop();
        }
    }
    int pop() {
        int x = _data.top();
        _data.pop();
        return x;
    }
    int peek() {
        return _data.top();
    }
    bool empty() {
        return _data.empty();
    }
private:
    stack<int> _data;
};

int main() {
    MyQueue mq;
    mq.push(1);
    mq.push(2);
    mq.push(3);
    cout << mq.pop() << endl;
    mq.push(4);
    mq.push(5);
    cout << mq.pop() << endl;
}

2.利用队列实现栈

//利用队列实现栈
//关键点:利用临时队列将新元素x放在原始队列头部元素的前面,
//进而调用pop()时弹出x,从而实现后进先出
#include<queue>
#include<iostream>
class MyStack
{
public:
    void push(const int &x) {
        //将data_queue里的所有元素视作一个整体a 
        //临时队列,利用临时队列将新元素x放在a的前面
        //重点在于:如何将x插入队列[4,3,2,1]的头部(假设1所在位置为队列头部),
        //即[4,3,2,1,x](而_data插入x后是[x,4,3,2,1]不能实现x的后进先出)。
        
        std::queue<int> _temp_queue;
        //将x插入临时队列头部,此时_temp_queue为[x]
        _temp_queue.push(x);
        //将_data队列里的元素依次插入_temp_queue,此时_temp_queue为[4,3,2,1,x],
        //此时,已实现临时队列_temp_queue的x后进先出
        while (!_data.empty())
        {
            _temp_queue.push(_data.front());
            _data.pop();
        }
        //_temp_queue中的队列元素依次插入_data队列中。此时_data为[4,3,2,1,x]
        //,pop()时弹出x,实现了队列_data的x后进先出
        while (!_temp_queue.empty()) {
            _data.push(_temp_queue.front());
            _temp_queue.pop();
        }
    }
    int pop() {
        int x = _data.front();
        _data.pop();
        return x;
    }
    int top() {
        return _data.front();
    }
    bool empty() {
        return _data.empty();
    }
private:
    std::queue<int> _data;//_data数据队列存储元素的顺序就是栈存储元素的顺序
};

int main() {
    MyStack ms;
    ms.push(3);
    ms.push(4);
    //while(!ms.empty())
    std::cout << ms.pop() << std::endl;
    ms.push(5);
    std::cout << ms.pop() << std::endl;
}