【数据结构与算法】用两个栈实现一个队列

题目

  • 用两个栈,实现一个队列
  • 功能 add delete length

队列

        用数组可以实现队列,数组和队列的区别是:队列是逻辑结构是一个抽象模型,简单地可以用数组、链表实现,所以数组和链表是一个物理结构,队列是一个逻辑结构。数组和链表可以实现队列,但是复杂的队列服务则需要单独设计。如常见的消息队列。

队列的特性:先进先出

API: add delete length

// 数组的队列形式
const queue = []

queue.push(100) // 入队
queue.push(200)

const n =  queue.shift() // 出队

实现思路

 如现有一个队列,入队顺序是 A B C,出队顺序也是 A B C,用两个栈 stack1、stack2 实现入队、出队。由于栈是先进后出,所以需要在A B C分别入栈 stack1 后,再将 stack1 每个元素pop 出栈且入栈 stack2 ,接着将 stack2 进行pop 操作,此时 A 出栈。最后将 stack2 内剩余元素压回到 stack1,方便后续stack1 的入栈操作。所以当队列里要入队一个元素时只需要一步,而要出队一个元素时则需要在两个 stack 之间进行腾挪。

 

/**
* 两个栈一个队列
*/
export class MyQueue {
    private stack1: number[] = []
    private stack2: number[] = []
    // 入队
    add(n: number) {
        this.stack1.push(n)
    }
    // 出队
    delete(n: number) {
        let res
        const stack1 = this.stack1
        const stack2 = this.stack2

        // 将 stack1 所有元素移动到 stack2 中
        while(stack1.length) {
            const n = stack1.pop()
            if(n != null) {
                stack2.push(n)
            }
        }
    
        // stack2 pop
        res = stack2.pop()
            
        // 将 stack2 中的元素还给 stack1
        while(stack2.length) {
            const n = stack2.pop()
            if(n != null) {
                stack1.push(n)
            }
        }

        return res || null
    }
    // 入队
    get length(): number {
        return this.stack1.length
    }
}

单元测试 

/**
* 两个栈,一个队列
*/
describe('两个栈,一个队列', () => {
    it('add and length', () => {
        const q = new MyQueue()
        expect(q.length).toBe(0)

        q.add(100)
        q.add(200)
        q.add(300)
        expect(q.length).toBe(3)
    })
    it('delete', () => {
        const q = new MyQueue()
        expect(q.delete()).toBeNull()

        q.add(100)
        q.add(200)
        q.add(300)
        expect(q.delete()).toBe(100)
        expect(q.length).toBe(2)
        expect(q.delete()).toBe(200)
        expect(q.length).toBe(1)
    })
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/550347.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust腐蚀服务器修改背景和logo图片操作方法

Rust腐蚀服务器修改背景和logo图片操作方法 大家好我是艾西一个做服务器租用的网络架构师。在我们自己搭建的rust服务器游戏设定以及玩法都是完全按照自己的想法设定的,如果你是一个社区服那么对于进游戏的主页以及Logo肯定会有自己的想法。这个东西可以理解为做一…

MaxCompute 近实时增全量处理一体化新架构和使用场景介绍

随着当前数据处理业务场景日趋复杂,对于大数据处理平台基础架构的能力要求也越来越高,既要求数据湖的大存储能力,也要求具备海量数据高效批处理能力,同时还可能对延时敏感的近实时链路有强需求,本文主要介基于 MaxComp…

Docker安装xxl-job分布式任务调度平台

文章目录 Docker安装xxl-job分布式任务调度平台1.xxl-job介绍2. 初始化“调度数据库”3、docker挂载运行xxl-job容器3.1、在linux的opt目录下创建xxl_job文件夹,并在里面创建logs文件夹和application.properties文件3.2、配置application.properties文件&#xff0c…

基于Qt的二维码生成与识别

基于Qt的二维码生成与识别 一、获取QZxing开源库 1.通过封装的QZxing开源库生成和识别二维码,下载地址:GitCode - 开发者的代码家园https://gitcode.com/mirrors/ftylitak/qzxing/tree/master。 2.下载解压后,使用Qt Creator xx&#xff0…

Yolo-world+Python-OpenCV之摄像头视频实时目标检测

上一次介绍了如何使用最基本的 Yolo-word来做检测,现在我们在加opencv来做个实时检测的例子 基本思路 1、读取离线视频流 2、将视频帧给yolo识别 3、根据识别结果 对视频进行绘制边框、加文字之类的 完整代码如下: import datetimefrom ultralytics …

使用undetected-chromedriver遇到的问题及解决方法,以及它使用SOCKS代理的问题

环境:python3.8.10 uc的安装方法: pip38 install undetected-chromedriver 上测试代码: import undetected_chromedriver as uc driver uc.Chrome() driver.get(https://www.baidu.com) driver.save_screenshot(baidu.png)报错&#xff…

如何用JAVA如何实现Word、Excel、PPT在线前端预览编辑的功能?

背景 随着信息化的发展,在线办公也日益成为了企业办公和个人学习不可或缺的一部分,作为微软Office的三大组成部分:Word、Excel和PPT也广泛应用于各种在线办公场景,但是由于浏览器限制及微软Office的不开源等特性,导致…

【大语言模型】如何让ChatGPT等LLM拥有记忆

我们现在在跟ChatGPT等生成式人工智能聊天时,都需要我们给定一个上下文,生成式AI才会根据我们问题结合上下文给出回答,他们并没有任何记忆。想象一下未来我们有一个AI机器人在我们的身边,每天它的记忆都会归零,你必须跟…

LVM和磁盘配额

目录 1、LVM (1)LVM机制 (2)LVM的管理命令 (3)创建并使用LVM (4)扩容 2、磁盘配额 (1)什么叫磁盘配额 (2)磁盘配额的条件和特点…

三道模拟题

P1003 [NOIP2011 提高组] 铺地毯 题目描述 原题点这里-->P1003 [NOIP2011 提高组] 铺地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺…

RUST腐蚀服务器添加 TAGS标签教程

RUST腐蚀服务器添加 TAGS标签教程 大家好我是艾西,一个做服务器租用的网络架构师。我们自己搭建架设的服务器在steam展示面板看到跟别人的不一样是咋回事? 这个其实就是服务器的一个标签,那么主要的作用就是让大家在选择服务器时更快更直接的…

淘系电商课程,0基础实战教学,实操性系统性实时性

课程下载:https://download.csdn.net/download/m0_66047725/89064789 更多资源下载:关注我。 课程内容: 00.前言一做好电商的基本认知 .mp4 01.电商卖货的底层逻辑和权重解析,mp4 02.做好产品的前期准备工作.mp4 03.店铺如何布局产品,m…

NTC热敏电阻采集温度-单片机通用模板

NTC热敏电阻采集温度-单片机通用模板 一、NTC热敏电阻转换温度的原理二、AT104Tem.c的实现三、AT104Tem.h的实现 一、NTC热敏电阻转换温度的原理 ①NTC热敏电阻会随着温度的升高,电阻值R逐渐降低;②硬件搭建电阻分压电路采集ADC逆推热敏电阻当前的阻值&…

顺序表(快速上手数据结构)

在介绍ArrayList之前, 我们需要先了解List. List是一个接口,它继承于Collection接口(Collection又继承于最顶层的接口Iterable). 从数据结构的角度来看,List就是一个线性表(Linear List),即n个具有相同类型元素的有限序列, 在该序列上可以执行增删查改等操作. 注意: List是一…

7 pytorch DataLoader, TensorDataset批数据训练方法

前言 本文主要介绍pytorch里面批数据的处理方法,以及这个算法的效果是什么样的。具体就是要弄明白这个批数据选取的算法是在干什么,不会涉及到网络的训练。 from torch.utils.data import DataLoader, TensorDataset主要实现就是上面的数据集和数据载入…

Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案

原文首发链接:Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案 大家好,我是码农先森。 引言 这次实现音视频实时通信的方案是基于 WebRTC 技术的,它是一种点对点的通信技术,通过浏览器之间建立对等连接,实现音频…

InfiniGate自研网关实现思路一

1.HTTP请求会话协议处理 运用Netty对HTTP请求信息的协议转换,构建网关会话服务,简单响应HTTP请求信息到页面。 之所以称之为会话,是因为一次 HTTP 请求,就要完成;建立连接、协议转换、方法映射、泛化调用、返回结果等…

吃透2000-2024年600道真题和解析,科学高效通过2025年AMC8竞赛

为帮助孩子科学、有效备考AMC8竞赛,我整理了2000-2004年的全部AMC8真题(完整版共600道,且修正了官方发布的原试卷中的少量bug),并且独家制作成多种在线练习,利用碎片化时间,8个多月的时间足以通…

【Redis 神秘大陆】008 常见Java客户端

八、Redis 的 Java 客户端 8.1 Jedis 连接池 单点连接池 Jedis 连接池基于 Common-Pool 连接池里面放置的是空闲连接,如果被使用 (borrow)掉,连接池就会少一个连接,连接使用完后进行放回 (return&#…

HCIA-Datacom实验_05_实验三:OSPF路由协议基础实验

一、实验拓扑 二、实验步骤 (一)修改设备名称、配置接口IP、Loopback口IP R1 R2 R3 (二)配置OSPF R1 R2 R3 (三)配置认证 R1 R2 R3