JS 实现队列

2023-10-29

通过JS实现队列的数据结构,首先是最普通的队列,先入先出
在这里插入图片描述

// 队列
function createQueue() {
  // 队列
  let queue = []
  // 入队
  const enQueue = (data) => {
    if(data == null) return
    queue.push(data)
  }
  // 出队
  const deQueue = () => {
    if(queue.length === 0) return 
    const data = queue.shift()
    return data
  }
  // 获取列表
  const getQueue = () => {
    // 返回一个克隆的数组,避免外界直接操作
    return Array.from(queue)
  }
  return {
    enQueue,
    deQueue,
    getQueue
  }
}

还有就是循环队列
在这里插入图片描述

// 循环队列
function cirQueue (n) {
  // 设置队列大小
  if(!n) return console.error('创建失败,请按照cirQueue(n: number)格式传入')
  // 队尾
  let tial = 0
  // 队头
  let head = 0
  // 队列
  let queue = []
  // 入队
  function enQueue(data) {
    try {
      // 判断队列是否已满
      if((tial + 1) % n === head) return console.error('队列已满')
      tial = (tial + 1) % n
      queue.push(data)
    } catch(error) {
      console.log('error----', error)
    }
  }
  // 出队
  function deQueue() {
    try {
      // 判断空队列
      if(head === tial) return console.log('队列为空')
      head = (head + 1) % n
      let item = queue.shift()
      return item
    } catch(error) {
      console.log('error------', error)
    }
  }
  // 获取队列
  function getQueue() {
      try {
        return Array.from(queue)
      } catch(error) {
        console.log('error-----', error)
      }
  }
  // 获取队头、尾
  function getQueueHeadAndTial() {
    return {
      tial,
      head
    }
  }
  return {
    enQueue,
    deQueue,
    getQueue,
    getQueueHeadAndTial
  }
}

正常队列可能存在存满的情况,因此需要一定容错机制,当队列满了,可以先把任务存储下来
在这里插入图片描述

// 循环阻塞队列
function cirBlockQueue (n) {
  // 设置队列大小
  if(!n) return console.error('创建失败,请按照cirQueue(n: number)格式传入')
  // 队尾
  let tial = 0
  // 队头
  let head = 0
  // 队列
  let queue = []
  // 阻塞队列
  let waitQueue = cirQueue(n)
  // 入队
  function enQueue(data) {
    try {
      // 判断队列是否已满
      // 阻塞后不直接返回错误 把操作存储下来
      // if((tial + 1) % n === head) return console.error('队列已满')
      if((tial + 1) % n === head) {
        // 阻塞队列未满
        const { head: waitQueueHead, tial: waitQueueTial } = waitQueue.getQueueHeadAndTial()
        if((waitQueueTial + 1) % n !== waitQueueHead) {
          waitQueue.enQueue(data)
          return 
        } else {
          return console.error('队列已满')
        }
      }
      tial = (tial + 1) % n
      queue.push(data)
    } catch(error) {
      console.log('error----', error)
    }
  }
  // 出队
  function deQueue() {
    try {
      // 判断空队列
      if(head === tial) return console.log('队列为空')
      head = (head + 1) % n
      let item = queue.shift()
      // 阻塞队列不为空
      const { head: waitQueueHead, tial: waitQueueTial } = waitQueue.getQueueHeadAndTial()
      if(waitQueueHead !== waitQueueTial) {
        enQueue(waitQueue.deQueue())
      }
      return item
    } catch(error) {
      console.log('error------', error)
    }
  }
  // 获取队列
  function getQueue() {
      try {
        return Array.from(queue)
      } catch(error) {
        console.log('error-----', error)
      }
  }
  return {
    enQueue,
    deQueue,
    getQueue,
    tial,
    head
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS 实现队列 的相关文章

  • centos 下mysql登陆数据库

    1 centos初始化安装 mysql默认是没有密码的 命令行登陆 mysql u root p 提示输入密码 输入密码 即可
  • Scrapy爬取重庆安居客二手房并存入mysql数据库(下)

    上篇中我们获取了重庆的一二级区 Scrapy爬取重庆安居客二手房并存入mysql数据库 上 这一篇我们根据二级区获取相应的二手房信息 初始化数据库 创建二手房信息数据库表 house表存放二手房信息 house price存放价格 定期获取
  • cmake应用:集成gtest进行单元测试

    编写代码有bug是很正常的 通过编写完备的单元测试 可以及时发现问题 并且在后续的代码改进中持续观测是否引入了新的bug 对于追求质量的程序员 为自己的代码编写全面的单元测试是必备的基础技能 在编写单元测试的时候也能复盘自己的代码设计 是提

随机推荐

  • ORA-01861: 文字与格式字符串不匹配问题

    最近微服务项目运行时 JPA调用查询oracle数据库表时 会有如下错误 Caused by java sql SQLDataException ORA 01861 文字与格式字符串不匹配 附错误日志 2020 01 21 01 45 01
  • 大数据实时链路备战 —— 数据双流高保真压测

    一 大数据双流建设 1 1 数据双流 大数据时代 越来越多的业务依赖实时数据用于决策 比如促销调整 点击率预估 广告分佣等 为了保障业务的顺利开展 也为了保证整体大数据链路的高可用性 越来越多的0级系统建设双流 以保证日常及大促期间数据流的
  • Set接口学习(2)

    基本介绍 1 无序 没有索引 无下标序号 2 不允许重复元素 所以最多包含一个null 常用方法 和List接口一样 Set接口也是Collection的子接口 所以常用方法和Collection一样 Set接口的遍历方式 迭代器和fore
  • 树的前序、中序、后序遍历

    树的前序 中序 后序遍历 递归方法 a b c 树的结构定义 struct TreeNode typedef TreeNode Node typedef int EleType struct TreeNode Node lchild Nod
  • yolov5 【v4.0】用自有数据集训练结果大比拼【5s,5m,5l,5x,5shpy】

    5s python test py weights runs train exp9 weights best pt data data 9 yaml task test save json iou thres 0 5 模型大小 best p
  • 深度学习数据集处理(一)获取公开数据集

    深度学习数据集处理系列 深度学习数据集处理 二 数据集划分训练集 测试集 深度学习数据集处理 三 将自己数据集制作为TFrecords 本文介绍一些常用的深度学习关于图像处理方面的常用公开数据集的下载链接 以及数据集的简单介绍 MNIST数
  • 在VSCode中移除不必要的扩展

    在VSCode中移除不必要的扩展 在VSCode中安装扩展是编辑器缓慢且耗电的主要原因之一 因为添加的每个新扩展都会增加应用程序的内存和 CPU 使用率 VSCode现在已经具备了非常多的功能 我们可以将一些重复工作的扩展移除掉 卸载这些现
  • 统计学习方法——EM算法及其推广(一)

    统计学习方法 EM算法及其推广 EM算法及其推广 一 EM算法引入 EM算法 EM算法的导出 可不看 在非监督学习中的应用 EM算法的收敛性 参考文献 EM算法及其推广 一 EM算法 期望极大算法 是一种迭代算法 用于含有隐变量的概率模型参
  • ( 22美赛C题)基于投资最优交易策略的研究(部分内容)

    投资目前成为了一种十分流行的理财方式了 据相关数据 我们了解到黄金与比特币在金融市场上价格都具有波动性 市场交易员不定期的买入和卖出资产 其目的是使其回报最大化 本文就基于该目的对黄金与比特币五年的价格变化进行了分析 并通过建立相关模型进行
  • 网页显示正在加载安全连接服务器,QQ网页显示正在加载页面请稍候是什么意思,打不开...

    问题描述 网页游戏黑屏 白屏 IE导致的无法调出flash 原因分析 Flash游戏无法运行时 可能由于IE内核导致无法调出flash插件导致 我们尝试通过对IE的升降级进行测试 以下是IE升降级的教程 简易步骤 IE降级 360安全卫士
  • java中file操作

    File fo new File E pic old txt File f new File E pic new File fn new File E pic new test txt 1 创建文件夹 boolean mkdir 创建此抽象
  • vue3项目总结

    1 Pinia优化重复请求 在项目中 吸顶组件和首页的头部内容是一样的 所以不用发送两次请求 通过Pinia集中管理数据 再把数据给组件使用 只需要把请求封装在一个store里 调用即可使用 2 面板组件的封装 由于项目中的新鲜好物和人气推
  • 格 (数学)

    格 数学 维基百科 自由的百科全书 本文介绍的是 数学中的格 关于与 格 数学 同名的其他主题 详见 格 术语 格 lattice 来源于描述这种次序的 哈斯图的形状 在数学中 格是其非空有限子集都有一个上确界 叫并 和一个下确界 叫交 的
  • Linux常用技巧系列: Linux创建软链接ln -s,(更改cuda版本,从8.0到9.0,Cuda多版本共存, 图文教程)

    创建软连接在系统崩溃的时候也是经常用的功能 如果你已经需要用到 说明你对Linux系统已经有了一定的熟练程度 尤其在配置和修复mysql 配置cuda 不同版本的切换的时候 会用到 用法也非常简单 ln s source dir targe
  • Python数据结构:解锁高效编程

    今天 我们一起探索Python数据结构 以及它们如何利用他们编写高效和优雅的代码 为什么数据结构很重要 想象一下 您正在建造一座房子 您不会随意将砖块扔在一起 对吧 您会仔细规划并安排它们 以创建坚固的结构 嗯 编程也适用同样的原则 数据结
  • windows中的凭据管理

    前言 我们访问某个 带有密码的共有文件夹之后 只有在第一次访问的时候需要输入密码 只要记住密码 今后就可以一直访问 如何实现 通过windows的凭据管理来实现 如何查看凭据管理 step1 控制面板 step2 用户账户 凭据管理器 访问
  • 期货交易心得 Round 4

    期货市场永远是有赌性的 大家都在博弈 期货市场具有偶然性 不像其他行业 只要是一个优秀的企业家他的赢利就包含了更多的必然性 既然有赌性就涉及到赌的原则方法问题 首先的原则应该是赌钱不赌命 这里包括两方面含义 第一应该拿出你亏得起的钱到期货市
  • 大学生团体天梯赛(第三届)

    题目地址 天梯赛 include
  • 与失眠危机说再见,AI为你带来安宁的夜晚

    不知道你有没有这样的感觉 忙碌了一天 明明已经很累了 可依旧辗转反侧 难以入眠 只能睁着眼睛熬到天亮 不是不想睡 也不是不累 只是睡不着 失眠的感觉实在是太痛苦了 特别是第二天早上常常顶着两只熊猫眼 干什么都提不起劲 身体仿佛要散架 为了拥
  • JS 实现队列

    通过JS实现队列的数据结构 首先是最普通的队列 先入先出 队列 function createQueue 队列 let queue 入队 const enQueue data gt if data null return queue pus