17_7_18:两个栈实现一个队列。两个队列实现一个栈

本文介绍如何使用两个栈实现一个队列,并利用两个队列实现一个栈的数据结构设计方法。通过模板类MyQueue和MyStack,分别实现了队列的FIFO特性和栈的FILO特性。代码示例展示了具体的实现细节与测试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
1,使用两个栈实现一个队列
2,使用两个队列实现一个栈

1,使用两个栈实现一个队列

思路:
根据栈的FILO性质,将数据,全部存入第一个栈中;
再将第一个栈中数据全部放入第二个栈中;
这样,将数据从第二个栈中取出时,达到了FIFO效果。

template <typename T>
class MyQueue
{
public:
    MyQueue() 
    {}

    void Push(const T& data)
    {
        _s_1.push(data);
    }

    void Pop()
    {
        //如果:_s_2不为空。直接将_s_2中数据pop。
        //如果:_2_2为空,则将_2_1中数据搬运到_s_2中

        if (_s_2.empty())
        {
            while (!_s_1.empty())
            {
                T data = _s_1.top();
                _s_1.pop();
                _s_2.push(data);
            }
        }

        if (_s_2.empty())  //pop时,队列不能为空
            assert(0);

        std::cout << _s_2.top() << " ";//打印pop的节点
        _s_2.pop();
    }
private:
    std::stack<T> _s_1;
    std::stack<T> _s_2; 
};

2,使用两个队列实现一个栈
思路:
将队列_q_1中的元素只保留最后一个,其余全部搬移到_q_2中。
然后将,_q_1中保留的元素,出队列。
再将_q_2中元素搬移回_q_1中。
在整个过程中,_q_2只起中转作用

template <typename T>
class MyStack
{
public:
    MyStack()
    {}

    void Push(const T& data) 
    {
        _q_1.push(data);
    }

    void Pop() 
    {
        //将队列_q_1中的元素只保留最后一个,其余全部搬移到_q_2中。
        //然后将,_q_1中保留的元素,出队列。在将_q_2中元素搬移回_q_1中。
        //在整个过程中,_q_2只起中转作用
        if (_q_1.empty())
            assert(0);

        while (_q_1.size() > 1)
        {
            T pTemp = _q_1.front();
            _q_2.push(pTemp);
            _q_1.pop();
        }

        std::cout << _q_1.front() << " "; //打印pop的节点
        _q_1.pop();

        while (!_q_2.empty())
        {
            T pTemp = _q_2.front();
            _q_2.pop();
            _q_1.push(pTemp);
        }
    }

private:
    std::queue<T> _q_1;
    std::queue<T> _q_2;
};

题目中所需头文件以及测试用例

头文件:

#include <iostream>
#include <cassert>
#include <stack>
#include <queue> 

测试用例:

“`

“`int main()
{
std::cout << “用两个栈实现队列:0-9输出如下:” << std::endl;
MyQueue q;
for (int i = 0; i < 10; ++i)
{
q.Push(i);
}
for (int i = 0; i < 10; ++i)
{
q.Pop();
}

std::cout << std::endl;

std::cout << "用两个队列实现栈:0-9输出如下:" << std::endl;
MyStack<int> s;
for (int i = 0; i < 10; ++i)
{
    s.Push(i);
}
for (int i = 0; i < 10; ++i)
{
    s.Pop();
}

system("pause");
return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值