用两个栈实现队列——js

本文介绍如何利用两个栈来模拟一个队列,详细解释了思路和代码实现。在入队时元素压入栈1,出队时先判断栈2是否为空,如果为空则将栈1元素移至栈2,保持队列的先进先出特性。同时,文章还涵盖了队列和栈的基本概念及操作。
摘要由CSDN通过智能技术生成

用两个栈实现队列

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

思路

一个队列包含两个栈,操作两个先进后出的栈实现一个先进先出的队列。在入队的时候,直接压入栈1。出队时,先判断栈2是否为空,如果为空,就把栈1里已经有的元素pop出去,再push进栈2中;如果栈2不为空,先把栈2中的元素pop出去,再把栈1的元素push进来。

代码

function Stack(){
    var item = [];
    this.push = function(node){
        item.push(node);
    };
    this.pop = function(){
        return item.pop();
    };
    this.isnull = function(){
        return item.length===0;
    }
}
var stack1 = new Stack();
var stack2 = new Stack();

function push(node)
{
    // write code here
    stack1.push(node);
}
function pop()
{
    // write code here
    if(stack1.isnull()&&stack2.isnull()){
        return false;
    }else if(stack2.isnull()){
        while(!stack1.isnull()){
            stack2.push(stack1.pop());
        }
    }
    return stack2.pop()
}

用数组自带的方法更简单

var ans = [];
function push(node)
{
    // write code here
    ans.push(node)
}
function pop()
{
    // write code here
    return ans.shift()
}

知识点

1.队列是先进先出,调用数组的push和shift方法。队列的Push:在尾部插入节点;Pop:在头部删除节点。
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。
2.栈是后进先出。在栈中查找最大或最小元素时间复杂度:O(n)。
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

拓展

实现类似栈的行为

将push()和pop()结合在一起,我们就可以实现类似栈的行为:

//创建一个数组来模拟堆栈
var a=new Array();
console.log(a);
//push: 在数组的末尾添加一个或更多元素,并返回新的长度
console.log("入栈");
a.push(1)
console.log(a);//----->1
a.push(2);
console.log(a);//----->1,2
a.push(3);
console.log(a);//----->1,2,3
a.push(4);
console.log(a);//----->1,2,3,4
console.log("出栈,后进先出");
console.log(a);
//pop:从数组中把最后一个元素删除,并返回这个元素的值
a.pop();//----->4
console.log(a);
a.pop();//----->3
console.log(a);
a.pop();//----->2
console.log(a);
a.pop();//----->1
console.log(a);

在这里插入图片描述
实现类似队列的行为

将shift()和push()方法结合在一起,可以像使用队列一样使用数组。即在数组的后端添加项,从数组的前端移除项:

//创建一个数组来模拟队列
var a=new Array();
console.log(a);
//push: 在数组的末尾添加一个或更多元素,并返回新的长度
console.log("入队");
a.push(1)
console.log(a);//----->1
a.push(2);
console.log(a);//----->1,2
a.push(3);
console.log(a);//----->1,2,3
a.push(4);
console.log(a);//----->1,2,3,4
console.log("出队,先进先出");
console.log(a);
//shift:从数组中把第一个元素删除,并返回这个元素的值
a.shift();//----->1
console.log(a);
a.shift();//----->2
console.log(a);
a.shift();//----->3
console.log(a);
a.shift();//----->4
console.log(a);

在这里插入图片描述
除此之外,还可以同时使用unshift()和pop()方法,从相反的方向来模拟队列,即在数组的前端添加项,从数组的后端移除项。如下面的示例所示:

//创建一个数组来模拟队列
var a=new Array();
console.log(a);
//unshift: 在数组的前端添加一个或更多元素,并返回新的长度
console.log("入队");
a.unshift(1)
console.log(a);//----->1
a.unshift(2);
console.log(a);//----->2,1
a.unshift(3);
console.log(a);//----->3,2,1
a.unshift(4);
console.log(a);//----->4,3,2,1
console.log("出队,先进先出");
console.log(a);
//pop:从数组中把最一个元素删除,并返回这个元素的值
a.pop();//----->4
console.log(a);
a.pop();//----->3
console.log(a);
a.pop();//----->2
console.log(a);
a.pop();//----->1
console.log(a);

在这里插入图片描述
在这里插入图片描述
https://blog.csdn.net/weixin_38383877/article/details/81811621

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值