【转】《剑指Offer》JavaScript实战——用两个栈实现队列

字节觅云使
• 阅读 1197

题目描述

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

解题方法

let stack1=[],//两个数组模拟栈的行为
    stack2=[];
function push(node)
{
    // write code here
    //栈是后入先出(LIFO),队列是先入先出(FIFO)
    //模拟队列的push操作,直接往栈中推入即可
    //但是要考虑辅助栈中还存在值的情况,需要先将辅助栈中的值推回存储栈中
    while(stack2.length !== 0){
        stack1.push(stack2.pop());
    }
    stack1.push(node);
}
function pop()
{
    // write code here
    //模拟队列的pop操作则要考虑栈的后入先出特性,需要先将存储栈中的数组,推入辅助栈,然后辅助栈弹出
    while(stack1.length !== 0){
        stack2.push(stack1.pop());
    }
    return stack2.pop();
}

拓展——用两个队列实现一个栈的pop和push操作

    本质上和上面的没什么区别,只要抓住一点,栈是后入先出(LIFO),队列是先入先出(FIFO)。下面是实现代码。

let queue1=[],//两个数组模拟队列的行为
    queue2=[];
function push(node) {
    //推入的时候要判断哪个队列中有值,就推入那个队列中
    if(queue1.length === 0){
        queue2.push(node);
    }else{
        queue1.push(node);
    }
}
 
function pop() {
    //弹出的时候判断哪个队列中有值,则先将该队列中的n-1个值弹出并存入另一个队列中,然后弹出最后一个值则为结果
    if(queue1.length === 0){
        while(queue2.length !== 1){
            queue1.push(queue2.pop());
        }
        return queue2.pop();
    }else{
        while(queue1.length !== 1){
            queue2.push(queue1.pop());
        }
        return queue1.pop();
    }
}

点赞
收藏
评论区
推荐文章
Easter79 Easter79
4年前
stack顺序存储结构
《偶刚开始学习数据结构,欢迎拍砖111》栈是只能通过访问它的一段来实现数据存储的一种线性数据结构,换句话来说就是先进后出的原则,FILO,与队列刚好相反哈,现在只说stack。栈包括以下几种基本运算(1)初始化(2)判断是否为空(3)push(4)pop(5)top其他的则根据这几种基本操作进行组合,即可实现。栈的实现同样
似梦清欢 似梦清欢
3年前
栈和队列
栈原理栈(stack)又名堆栈,是一种只能在表尾进行插入和删除操作的线性表。能够进行操作的这一端被称为栈顶,相对地,把另一端称为栈底。:::warning栈内元素操作时先进后出,类似于电梯上下成员,最后进去的人最先出
徐小夕 徐小夕
5年前
如何使用css3实现一个类在线直播的队列动画
之前在群里有个朋友问了这样一个问题,就是如何在小程序中实现类似直播平台的用户上线时的队列动画?作为一名前端工程师,解决方案无非以下2种:1.使用javascript根据条件来控制元素的样式实现队列动画2.用纯css3配合数据驱动模型来实现.大家都知道在现代的Web开发中,我们能使用Css实现的效果尽量不要用Js,所以我们应该优先考虑用C
Stella981 Stella981
4年前
C++ 优先队列priority_queue用法
头文件:include<queue操作:top访问队头empty队列是否为空size返回队列元素个数push插入元素到队尾pop弹出队头swap交换内容定义:1/2Type数据类型3Container容器类型(必须是vect
Stella981 Stella981
4年前
LinkedBlockingQueue 介绍
LinkedBlockingQueue是一个基于已链接节点的、范围任意的blockingqueue。此队列按FIFO(先进先出)排序元素。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可
Wesley13 Wesley13
4年前
C++栈和队列
使用标准库的栈和队列时,先包含相关的头文件include<stackinclude<queue定义栈如下:stack<intstk;定义队列如下:queue<intq;栈提供了如下的操作s.empty()如果栈为空返回true,否则返回fals
Stella981 Stella981
4年前
Javascript数组系列一之栈与队列
所谓数组(英语:Array),是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。---百度百科简单理解,数组就是数据的有序列表。Array在Javascript中属于最常用的数据类型之一了,与其它语言一样Javascript中的数
Stella981 Stella981
4年前
Redis(四)——消息队列
Redis不仅可作为缓存服务器,还可用作消息队列。它的列表类型天生支持用作消息队列。\\性质:\\由于Redis的列表是使用双向链表实现的,保存了头尾节点,所以在列表头尾两边插取元素都是非常快的。所以可以直接使用Redis的List实现消息队列,只需简单的两个指令lpush和rpop或者rpush和lpop。(列表常用命令)R
Wesley13 Wesley13
4年前
Java并发 阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加操作支持阻塞地插入和移除方法。支持阻塞插入的方法是指当队列满时会阻塞插入元素的线程,直到队列不满;支持阻塞移除的方法是指当队列为空时获取元素的线程无法继续获取元素直到队列不空。可以发现阻塞队列非常适合消费者和生产者场景下进行使用,生产者生产数据就是向阻塞队列中插入元素,消费者消
菜园前端 菜园前端
2年前
什么是栈?
原文链接:栈是基础数据结构,栈是一种遵循后进先出原则的有序集合,添加新元素的一端称为栈顶,另一端称为栈底。操作栈的元素时,只能从栈顶操作(添加、移除、取值)。实现功能在JavaScript中没有栈,但是可以通过Array实现栈的所有功能push()入栈po
菜园前端 菜园前端
2年前
什么是队列
原文链接:什么是队列?队列是一种遵循先进先出原则的有序集合,添加新元素的一端称为队尾,另一端称为队首。实现功能在JavaScript中没有队列,但是可以通过Array实现队列的所有功能enqueue()入队dequeue()出队top()获取队首值size
字节觅云使
字节觅云使
Lv1
眼盛星河,心向远方。
文章
2
粉丝
0
获赞
0