【前端算法】两个栈实现一个队列

简介: 介绍栈和队列的区别,以及如何使用栈实现一个队列
  • 请用两个栈,实现一个队列
  • 功能 add delete length

队列

  • 先进先出
  • API : add delete length

逻辑结构 VS 物理结构

  • 队列是逻辑结构,抽象模型
  • 简单的,可以使用数组、链表实现
  • 复杂的队列服务,需单独设计

思路

  • 入队直接使用push填入栈1
  • 出队:先将栈1的元素pop到栈2,然后栈2使用pop,最后栈2在pop到栈1

示例:入队===> ABCD === 【DCBA】

——
D
C
B
A
——

此时A在栈底,但是队列是先进先出,要删除A,需要将A放到栈顶。

出队:1、栈1【DCBA】===pop===>栈2【ABCD】

——
A
B
C
D
——

此时栈2中,A是在栈顶,可以删除A,满足队列先进先出的规则。

2、栈2【ABCD】===pop(A)===> 【BCD】

——
B
C
D
——

此时已经删除完了A,但是后续继续增加新的元素E或F,应该在D的后面,

3、栈2【BCD】===pop===> 栈1【DCB】

——
D
C
B
——

所以第三步D在栈顶,新增新的元素E或F,就在D的后面,满足的队列的先进先出规则。

代码实现

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

  add(num:number) {
    this.stack1.push(num)
  }

  delete():number | null {
    let res;
    const stack1 = this.stack1
    const stack2 = this.stack2
    // 将stck1 所有元素移动到stack2中
    while(stack1.length){
      const n:number = stack1.pop() as number
      if (n != null){
        stack2.push(n)
      }
      
    }
    // stack2 pop
    res = stack2.pop()

    // 将 stack2 所有元素“还给”stack1
    while(stack2.length){
      const n = stack2.pop() as number
      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.log(q.length) // 3
console.log(q.delete()) // 100
console.log(q.length) // 2

满足队列先进先出的规则

单元测试

describe('两个栈,一个队列',() => {
    it('add and length', () => {
        const q = new MyQueue()
        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.length).toBe(3)
        expect(q.delete()).toBe(100)
        expect(q.length).toBe(2)
        expect(q.delete()).toBe(200)
        expect(q.length).toBe(1)
        expect(q.delete()).toBe(300)
        expect(q.length).toBe(0)
    })
})

性能分析

  • 时间复杂度:add==>O(1); delete ==> O(n)
  • 空间复杂度,整体是O(n)

虽然在delete中有两次循环,但不是嵌套关系,所以它是时间和空间复杂度都是O(n);

相关文章
|
缓存 监控 算法
内网监控管理软件:PHP 语言队列算法揭秘
在数字化办公环境中,内网监控管理软件对企业的稳定运行和信息安全至关重要。本文深入介绍PHP中的队列算法及其在内网监控软件中的应用,包括监控数据收集、任务调度和日志记录等场景,通过代码示例展示其实现方法。队列算法可提高性能、保证数据顺序并实现异步处理,为企业提供高效的安全保障。
308 1
【算法】栈
栈相关算法题,供参考,附有链接地址及板书
262 14
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
1401 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
1362 4
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
426 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
477 3
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
290 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
算法 数据挖掘
【栈和队列】算法题 ---- 力扣(二)
【栈和队列】算法题 ---- 力扣
|
存储 算法
【栈和队列】算法题 ---- 力扣(一)
【栈和队列】算法题 ---- 力扣

热门文章

最新文章