算法:什么是队列 用两个栈实现一个队列

news2024/11/26 9:54:49

题目

用两个栈实现一个队列。

队列、栈是一类,都是抽象模型
数组、链表是一类,都是具体实现

队列

逻辑结构,抽象模型,可以用任何语言来实现

  • 先进先出
  • add、delete、length

在这里插入图片描述
用数组来模拟

const queue = []
// 入队
queue.push(1)
queue.push(2)
queue.push(3)
...

// 出队
queue.shift()

shift 性能不好,用数组实现队列肯定是不好的,我们先不管。后面用链表实现队列就不会有性能问题了。

简单的队列可以用数组、链表实现,复杂的队列服务需要单独设计,比如消息队列MQ
在这里插入图片描述
其实就是消息生产端把消息 A 发送到队列MQ中,消费者B来消费,比如存数据库或者数据分析等等。

思路

删除:
有两个 stack。
先让原始队列的数据入栈stack1,比如这时栈里是
在这里插入图片描述
队列A先进先出,那么我们需要把stack1中的C、B依次放入stack2中,然后让stack1中的A出栈,再把stack2重新入栈到stack1。

添加:
直接给stack1 push就行

代码

export class MyQueue {
    private stack1: number[] = []
    private stack2: number[] = []

    /**
     * 入队
     * @param n n
     */
    add(n: number) {
        this.stack1.push(n)
    }

    /**
     * 出队
     */
    delete(): number | null {
        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
    }
}
// 功能测试
const q = new MyQueue()
q.add(100)
q.add(200)
q.add(300)
console.info(q.length)
console.info(q.delete())
console.info(q.length)
console.info(q.delete())
console.info(q.length)

单元测试

import { MyQueue } from './two-stacks-one-queue'

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)
    })
})

时间复杂度
add函数:O(1)
delete函数:O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现哈里斯鹰优化算法(HHO)优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO),该算法有较强的全…

MySQL数据库的操作

MySQL数据库的操作 创建数据库 语法 create database [if not exists] db_name [create_specification,create_specification...]create_specification:[default] charactter set charest_name[default] collate collation_name 说明: []可选项 specification 特…

【智能座舱系】-智能座舱平台研究|各家主机厂都在使用的主流座舱软件平台

一、何为汽车智能化 以智能化和网联化的技术赋能车辆,实现车辆对复杂环境的有效感知和识别,实现对车辆与驾乘人员、对其他车辆、对其他基础设施的智能化交互。 二、智能的两大核心功能:智能化和网联化 智能化方面,汽车具备智能的人机交互,如语音、手势、图像及其他生物…

电脑开机无限重启,到了欢迎界面就黑屏重启

windows7系统,开机过程中,只要一过了四叶草,要么刚出来欢迎界面,要么还没出来就黑屏,然后重启,然后无限循环。。。 (经测试xp系统同样有效) 先尝试用方法1修复,若不行再用方法2。 方法1&…

【微服务中间件学习】redis基础及项目使用

背景 最近跟着大佬学习,发现之前都是一知半解,还是得系统学一下。 重温redis,有一下整理Redis是一种基于内存的高性能键值存储系统,它支持多种数据结构和持久化方式,并提供了许多高级功能,如发布/订阅、事…

Go项目布局建议

我们编写的 如果是Go 程序都是简单程序,一般由一个或几个 Go 源码文件组成,而且所有源码文件都在同一个目录中。但是生产环境中运行的实用程序可不会这么简单,通常它们都有着复杂的项目结构布局。弄清楚一个实用 Go 项目的项目布局标准是 Go …

21_I.MX6ULL_PWM背光实验

目录 LCD背光调节简介 相关寄存器 实验源码 LCD背光调节简介 正点原子的三个RGB LCD都有一个背光控制引脚,给这个背光控制引脚输入高电平就会点亮背光,输入低电平就会关闭背光。假如我们不断的打开和关闭背光,当速度足够快的时候就不会感觉到背光关闭这个过程了。这个正好可…

jmeter数据库连接6

1,准备资料1. 一个可用的数据库2.连接数据库需要的驱动 2,jmeter连接数据库3,发送插入语句请求4,发送查询语句请求5,发送删除语句请求6,对数据库进行压测本文永久更新地址: 1,准备资料 1. 一个可用的数据库 搭建一个…

笔试强训之【不要二和字符串转换为数字】

目录1.不要二1.1题目1.2解题思路1.3代码2.字符串转换为数字2.1题目2.2思路讲解2.3代码1.不要二 1.1题目 链接: link 描述 二货小易有一个W*H的网格盒子,网格的行编号为0-H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕…

加载美女图片之OpenCV 图像读取与显示

📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++和openCv阶段>——目标Windows,MySQL,Qt,数据结构与算法,openCv&#xff0…

优思学院|精益生产与 IE 两者有何分别?

精益生产或者精益管理和工业工程(IE)在工具和方法方面有一些相似之处,也它们也有一些相同的工具,但在思维方式、性质、历史和最近的发展也有一些重要的差异,优思学院会就这几个方面详细为大家作出区分。 思维方式 IE是…

介绍一款功能强大的步进电机控制驱动芯片TMC5240

步进电机由于具有控制简单,良好的速度和位置控制被大量用在工业自动化、医疗设备、仪器仪表、实验室自动化、办公自动化、智能家居......等众多行业,实现让步进电机转起来相对容易很多,但是在应用中简单的转起来并无法满足实际应用的需求&…

运行时内存数据区之本地方法栈

Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的)如果线程请求分配的栈容量超过本地方法栈允许的最大容量&…

域名、IP、DNS、Hosts、Nginx

先从最熟悉,也是最表层的域名和ip说起: 比如你和我,你叫张三,我叫李四,名字类似于域名。你在网吧玩,很多太多台电脑各自都有个座位号,座位号就类似于ip,我想去网吧找你去玩电脑&…

RK3568平台开发系列讲解(驱动基础篇)mmap系统调用详解

🚀返回专栏总目录 文章目录 一、什么是mmap二、mmap映射类型2.1、私有匿名映射2.2、私有文件映射2.3、共享文件映射2.4、共享匿名映射沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文将详细介绍mmap系统调用。 一、什么是mmap mmap/munmap函数是用户空间中常用的…

AttributeError: ‘LTP‘ object has no attribute ‘sent_split‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

PCB阻抗误差控制在5%,究竟有多难?

众所周知,阻抗控制是我们做高速设计最基本的原则。目前常规的板厂会把阻抗控制在10%的误差,不少朋友就会有疑问,为什么是10%?理论上误差肯定是越小越好,所以为什么不能进一步的把常规控制能力推到8%,甚至5%…

【Elastic (ELK) Stack 实战教程】10、ELK 架构升级-引入消息队列 Redis、Kafka

目录 一、ELK 架构面临的问题 1.1 耦合度过高 1.2 性能瓶颈 二、ELK 对接 Redis 实践 2.1 配置 Redis 2.1.1 安装 Redis 2.1.2 配置 Redis 2.1.3 启动 Redis 2.2 配置 Filebeat 2.3 配置 Logstash 2.4 数据消费 2.5 配置 kibana 三、消息队列基本概述 3.1 什么是…

DAP-seq技术鉴定全基因组水平上的ZjVND7靶基因,揭示酸枣全基因组复制在调节木质部导管分化和耐旱性中的作用

全基因组复制对生物体的影响是多方面的。全基因组加倍后,基因剂量效应、修饰的互作调控、快速遗传和表观遗传的修饰和变化,都会对基因组产生强烈影响,进而影响基因表达,最终导致形态、生理和适应性等性状方面的差异。在同源多倍化…

247个Python实战案例:从入门到进阶(含源码)

Python是目前最热门的编程语言之一。由于其可读性和对初学者的友好性,已被广泛使用。 那么要想学会并掌握Python,可以实战的练习项目是必不可少的。 这247个实战案例让你告别枯燥,60秒学会一个小例子,系统学习Python,从…