专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 教你如何用两个队列实现一个栈

教你如何用两个队列实现一个栈

更新时间:2022-10-11 09:49:37 来源:动力节点 浏览540次

如何用两个Java队列实现一个栈?动力节点小编来告诉大家。我们通过一系列栈的压入和弹出操作来分析用两个队列模拟一个栈的过程。如图(a)所示,我们先往栈内压入一个元素A。由于两个队列现在都是空的,我们可以选择把A插入两个队列的任意一个。不妨插入queue1。接下来继续往栈内压入B、C两个元素,我们把它们都插入queue1。这个时候queue1包含3个元素A、B和C,其中A位于队列的头部,C位于队列的尾部。

现在我们考虑从栈内弹出一个元素。根据栈的后入先出原则,最后被压入栈的C应该最先被弹出。由于C位于queue1的尾部,而我们每次只能从队列的头部删除元素,因此我们可以先从queue1中依次删除元素A、B并插入到queue2中,再从queue1中删除元素C。这就相当于从栈中弹出元素C了(如图(b)所示)。我们可以用同样的方法从栈内弹出元素B(如图©所示)

接下来我们考虑往栈内压入一个元素D。此时queue1已经有一个元素,我们就把D插入到queue1的尾部(如图(d)所示)。如果我们再从栈内弹出一个元素,此时被弹出的应该是最后被压入的D。由于D位于queue1的尾部,我们只能先从有删除queue1的元素并插入到queue2,直到在queue1中遇到D再直接把它删除(如图(e)所示)。

注意在此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。

完整代码

#include <iostream>
#include <stdlib.h>
#include <stack>
#include <queue>
using namespace std;
template <typename T> class CStack{
public:
    CStack(void){};
    ~CStack(void){};
    void push(const T& node);
    T pop();
private:
    queue<T> queue1;
    queue<T> queue2;
};
//插入元素:往非空的队列中增加元素,若都为空,则默认往queue1中添加
template <typename T> void CStack<T>::push(const T& element)
{
    if (queue1.size() > 0)//如果queue1不为空则往queue1中插入元素
        queue1.push(element);
    else if (queue2.size() > 0)//如果queue2不为空则往queue2中插入元素
        queue2.push(element);
    else//如果两个队列都为空,则往queue1中插入元素
        queue1.push(element);
}
//删除元素
template <typename T> T CStack<T>::pop()
{
    if (queue1.size() == 0)    //如果queue1为空
    {
        while (queue2.size() > 1)    //当queue2中大于一个元素时,则
            //将其余元素保存到queue1中,保证queue2中只有一个元素
        {
            queue1.push(queue2.front());//压入queue1
            queue2.pop();//然后删除
        }
        //只剩下一个元素时,即出列,此时对于由两个队列构成的栈而言,
        //弹出的即是最后进入的元素,符合后进先出
        T& data = queue2.front();//存储
        queue2.pop();//而后删除
        return data;
    }
    else   //如果queue2为空
    {
        while (queue1.size() > 1) // 当queue1中大于一个元素时,则
            //将其余元素保存到queue2中,保证queue1中只有一个元素
        {
            queue2.push(queue1.front());//压入queue2
            queue1.pop();//然后删除
        }
        //只剩下一个元素时,即出列,此时对于由两个队列构成的栈而言,
        //弹出的即是最后进入的元素,符合后进先出
        T& data = queue1.front();
        queue1.pop();
        return data;
    }
}
int main()
{
    CStack<int> stack;
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);
    int len = 4;
    while (len>0)
    {
        cout << stack.pop() << " ";
        --len;
    }
    return 0;
}

对于push和pop操作,其时间为O(n).

运行结果:

以上就是关于“教你如何用两个队列实现一个栈”的介绍,大家如果想了解更多相关知识,不妨来关注一下本站的Java在线学习,里面的课程内容细致全面,适合没有基础的小伙伴学习,希望对大家的学习能够有所帮助哦。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>