使用 js 实现 队列

2023-10-28

队列是一种特殊的列表,队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,先进先出。

参数

接收的参数为数组类型。

属性及方法

栈的抽象数据类型定义

列表 属性或方法 描述
enqueue 方法 向队尾加入一个元素
dequeue 方法 删除队首的元素
front 方法 读取队首元素
back 方法 读取队尾元素
toString 方法 返回队列的字符串形式
clear 方法 清空队列
length 方法 返回队列内元素的个数
empty 方法 队列是否为空

下面看下代码实现:

/**
 * 简单队列
 */
// ES5
function Queue(data = []) {
  this.dataStore = data
  this.enqueue = enqueue
  this.dequeue = dequeue
  this.front = front
  this.back = back
  this.toString = toString
  this.clear = clear
  this.length = length
  this.empty = empty
}

function enqueue(element) {
  this.dataStore.push(element)
}

function dequeue() {
  return this.dataStore.shift()
}

function front() {
  return this.dataStore[0]
}

function back() {
  return this.dataStore[this.length() - 1]
}

function toString() {
  return this.dataStore.join()
}

function clear() {
  this.dataStore = []
}

function length() {
  return this.dataStore.length
}

function empty() {
  return !this.dataStore.length
}

// ES6
class Queue6 {
  constructor(data = []) {
    this.dataStore = data
  }

  enqueue(element) {
    this.dataStore.push(element)
  }

  dequeue() {
    return this.dataStore.shift()
  }

  front() {
    return this.dataStore[0]
  }

  back() {
    return this.dataStore[this.length() - 1]
  }

  toString() {
    return this.dataStore.join()
  }

  clear() {
    this.dataStore = []
  }

  length() {
    return this.dataStore.length
  }

  empty() {
    return !this.dataStore.length
  }
}

队列演示示例可查看 例子

优先队列

在某些情况下,队列需要按照优先级进行排序、出队列,这个时候需要在入队列的时候按照一定的优先级规律进行排序,实现如下:

/**
 * 带优先级的队列,代码中使用 code 表示,数值越大,优先级越高,默认优先级为 0
 * 优先级越高,提前出队列,优先级相同,则按照入队列的顺序出队列
 * 例如 医院 挂号,病重的会优先
 */
// ES6
class Element {
  constructor(name, code = 0) {
    this.name = name
    this.code = code
  }
}

class QueueComplex {
  constructor() {
    this.dataStore = []
  }

  enqueue(element) {
    const dataStore = this.dataStore
    let entry = dataStore.length
    for (let i = dataStore.length - 1; i >= 0; i--) {
      if (i - 1 >= 0) {
        if (element.code > dataStore[i].code && element.code <= dataStore[i - 1].code) {
          entry = i
        }
      } else {
        if (element.code > dataStore[i].code) {
          entry = i
        }
      }
    }
    this.dataStore.splice(entry, 0, element)
  }

  dequeue() {
    return this.dataStore.shift()
  }

  front() {
    return this.dataStore[0]
  }

  back() {
    return this.dataStore[this.length() - 1]
  }

  toString() {
    const dataStore = this.dataStore
    let res = ''
    for (let i = 0, len = dataStore.length; i < len; i++) {
      res += `{ name: ${dataStore[i].name}, code: ${dataStore[i].code} }`
    }
    return res
  }

  clear() {
    this.dataStore = []
  }

  length() {
    return this.dataStore.length
  }

  empty() {
    return !this.dataStore.length
  }
}

优先队列演示示例可查看 例子

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 js 实现 队列 的相关文章

  • 抓取 Shopee API v4

    我有一个最终项目 其中我想要检索的数据是通过在shopee上抓取数据来获取的 但是当我在隐藏的API上抓取shopee时遇到问题 当我在Insomnia脚本上尝试时 脚本会运行 但是当我尝试时在本地或 google colab 脚本上 这是
  • 解析字符串:提取单词和短语 [JavaScript]

    我需要在以空格分隔的术语列表中支持确切的短语 用引号引起来 因此 用空格字符分割相应的字符串已经不够了 Example input foo bar lorem ipsum baz output foo bar lorem ipsum baz
  • 为什么我的数据没有存储到我的 Firebase 实时数据库中?

    我正在尝试为网络应用程序制作一个注册页面 这会将数据发送到 firebase 数据库 我已阅读官方 firebase 文档并按照说明写入数据 但什么也不会写 在我的数据库控制台中 它显示的所有内容都是空 而不是我的数据 我没有收到控制台错误
  • JavaScript 模板文字稍后替换变量(在知道值之前)

    是否可以在已知值之前以某种方式使用模板文字 JS 模板文字的每个演示都如下所示 var name John var s Hello name 但在现实世界中 模板是在我们知道变量值之前定义的 某处定义了模板 在页面加载时 var s Hel
  • 多个引导模式的滚动问题

    我有一个带有大量信息的模态页面 因此您需要滚动 该模式包含指向第二个模式的链接 When I 打开模态 1 单击链接打开模式 2 模式 1 保持在后台 然后关闭模式 2 以便我回到模式 1 modal 1 失去滚动 仍然有一个滚动条 但它不
  • 将json数据从servlet传递到jsp到js文件

    我得到了这个创建 JSON 数据的 servlet 我想将此数据传递到一个 jsp 页面 该页面应该通过 InfoVis 工具包显示数据 servlet java JSONObject json new JSONObject JSONArr
  • 如何使用 JQuery 创建新的 img 标签,并使用 JavaScript 对象中的 src 和 id?

    我从基本意义上了解 JQuery 但对它绝对是新手 并且怀疑这很容易 我在 JSON 响应中获得了图像 src 和 id 转换为对象 因此在 responseObject imgurl 和 responseObject imgid 中获得了
  • 如何从索引文件迭代多个导入的模块

    我有一个名为Polygons我在那里创建了一个index jsfile 以导出目录中的所有文件 它看起来像这样 export default as europe from europe export default as northAmer
  • DOM Range 克隆不能免受 DOM 更改的影响

    我正在使用 cloneRange 函数克隆 DOM Range 如果我然后像这样修改原始范围对象 range setStart range startContainer 1 克隆保留了旧的startOffset正如预期的那样 但是 如果我修
  • PrimeNG 数据表日期范围过滤器

    过滤日期范围 https stackblitz com edit angular fpowo5 file app components transactionList transactionList html 7C 数据表 https ww
  • Ext JS grid 获取最后选定行的 dom

    有没有机会获得DOM网格内最后选定行的值 我只能得到带有值的记录 而不是DOM元素 和DOM元素我的意思是 tr 所选行的元素 var selectedRecord grid getSelectionModel getLastSelecte
  • 如何获取当前页面样式表作为字符串?

    假设我当前的页面如下所示 我想
  • 两个同时发生的事件

    我在这个页面上使用了一段JS代码http 200tr ru app admin http 200tr ru app admin 当我按下十字符号时 会发生 2 个事件 模糊和单击 但仅运行模糊代码 我需要反点击交叉代码 我怎样才能做到这一点
  • 从外部 webpack 导入(运行时导入)

    这只是我今天想到的 我没有看到很多信息 所以我将分享这个weird案例以及如何我个人解决了它们 如果有更好的方法请评论 但同时这可能会帮助其他人 在 webpack 包中 每个import require你做的 是由 webpack 使用其
  • 如何在 JavaScript 中编写回文

    我想知道如何在javascript中编写回文 我在其中输入不同的单词 程序显示单词是否是回文 例如 单词 noon 是回文 而 bad 则不是 先感谢您 function palindrome str var len str length
  • javascript,正则表达式解析大括号中的字符串内容

    我是正则表达式的新手 我正在尝试解析字符串中大括号内的所有内容 我抬头这个帖子 https stackoverflow com questions 413071 regex to get string between curly brace
  • 跨浏览器“inArray”函数(无 jQuery)

    我没有意识到跨浏览器兼容性不好array indexOf https developer mozilla org en JavaScript Reference Global Objects Array indexOf Browser co
  • 检查警报框中单击“确定”按钮

    这是用于提醒某些值的代码 alert Click the OK button Now 所以现在我想检查是否单击了 确定 按钮 我怎样才能使用这个 JavaScript 来做到这一点 确认可以工作 var r confirm Click th
  • 如何动态地从对象中提取所有元素

    如何从对象中提取特定列 我有一个列数组 我希望从对象中提取这些字段 该对象将由作为项目的映射循环函数构造 现在在这里 如何动态检查我的字段 我不想要这样的 item col 0 请告诉我一个捷径 const person firstName
  • jQuery 会在过滤选择器中的其他参数之前搜索 ID 吗?

    这个问题与性能有关 如果我使用如下选择器 myID a Does this find myID and filter by a 或者我应该这样写声明 myID find a 我不确定 jQuery 是否足够聪明 可以首先使用 ID 执行此语

随机推荐

  • 从零开发一款ChatGPT VSCode插件

    本文作者是360奇舞团开发工程师 引言 OpenAI发布了ChatGPT 就像是给平静许久的互联网湖面上扔了一颗重磅炸弹 刹那间所有人都在追捧学习它 究其原因 它其实是一款真正意义上的人工智能对话机器人 它使用了深度学习技术 通过大量的训练
  • 那些年我在CSDN追过的安全白帽师傅,respect

    2019年7月 我来到了一个陌生的专业 网络空间安全专业 作为一个长期以Python数据挖掘和NLP方向为主的学生 突然换大方向 去从事系统安全和逆向分析的研究 还是挺难的 这两年的过程也极其艰辛 依稀记得 换专业当天我下定决心 希望利用未
  • 【算法7】编写算法实现带头结点的单链表就地逆置即空间复杂度O(1)

    方法一 利用头插法实现链表的逆置 算法思想 1 定义两个LNode 指针p 和r LNode p 用于遍历整个单链表 LNode r 指向p的后继结点防止断链 2 将p标记第一个结点 r标记p所指结点后继 3 依次将后续结点头插法插入头结点
  • maven 命令合集

    文章目录 安装到本地库 安装到私服 手动下载jar 手动下载jar 报错 手动下载 jar 使用指定的插件版本 使用maven help plugin描述插件 从而获得插件信息 查看冲突 jar 包 Effective Pom effect
  • 大家好,我给大家介绍一下,这是我的Linux故障排查思路

    我发现Linux系统在启动过程中会出现一些故障 导致系统无法正常启动 我在这里写了几个应用单用户模式 GRUB命令操作 Linux救援模式的故障修复案例帮助大家了解此类问题的解决 一 单用户模式 Linux系统提供了单用户模式 类似Wind
  • SpringBoot bean解析之refresh方法(五)

    这里主要着重看看refresh方法调用的finishBeanFactoryInitialization 初始化所有剩下的单例bean Finish the initialization of this context s bean fact
  • Maven(在java中的使用)

    在Javaweb开发中 需要使用大量的jar包 我们手动去导入 如何能够让一个东西自动帮我导入和配置这个jar包 由此 Maven诞生了 5 1Maven 项目架构管理工具 我们目前用来就是方便导入jar包的 Maven的核心思想 约定大于
  • 公司规定所有接口都用 POST 请求,这是为什么?

    最近在逛知乎的时候发现一个有趣的问题 公司规定所有接口都用 post 请求 这是为什么 原问题 zhihu com question 336797348 看到这个问题的时候其实我也挺有感触的 因为我也曾经这样问过我自己 在上上一家公司的时候
  • stackgan

    使用pix2pix网络进行stackgan的叠加 pix2pix来自github上一位日本同学的代码 stackgan https github com hanzhanggit StackGAN Pytorch blob master co
  • LC-6248. 统计中位数为 K 的子数组(回文:中心扩散+哈希、等价转换)【周赛321】

    6248 统计中位数为 K 的子数组 难度困难15 给你一个长度为 n 的数组 nums 该数组由从 1 到 n 的 不同 整数组成 另给你一个正整数 k 统计并返回 num 中的 中位数 等于 k 的非空子数组的数目 注意 数组的中位数是
  • 使用Matlab实现模拟退火算法求解函数极值问题

    使用Matlab实现模拟退火算法求解函数极值问题 模拟退火算法 Simulated Annealing 是一种启发式优化算法 常用于求解函数的极值问题 该算法的灵感来源于固体退火过程中的原子运动规律 通过模拟物质的退火过程来搜索最优解 在本
  • java代码走查审查规范

    分类 重要性 检查项 备注 命名 重要 命名规则是否与所采用的规范保持一致 成员变量 方法参数等需要使用首字母小写 其余单词首字母大写的命名方式 禁止使用下划线 数字等方式命名不要出现局部变量 成员变量大写字母开头等问题 一般 是否遵循了最
  • 计算机图形学games101作业二 ---- 三角形光栅化 超采样抗锯齿 黑边处理

    games101作业二 三角形光栅化 超采样抗锯齿 黑边处理 本文是在学习计算机图形学时根据课程作业进行整理的笔记 有错误请指出 如果是同课程 请勿复制粘贴 谢谢 文章目录 CG homework1 0 本次作业 实现函数及简单描述 详细
  • WSL通过WINDOWS走代理

    WSL如何与WINDOWS端口通信 由于项目需求想让WSL和桌面的端口通信 看了网上大量的帖子很是糟乱 浪费了大量的时间 于是本人写此博客来帮助到有需要的人 软件配置 勾选软件的局域网的连接 开启MUX多路复用 需要通信的端口信息如下图所示
  • centos8解决yum安装报错

    Error Failed to download metadata for repo appstream Cannot prepare internal mirrorlist No URLs in mirrorlist 在学习使用 dock
  • SQL基础知识整理

    SQL基础知识整理 常见的SQL面试题 经典50题 三 50道面试题 2 汇总统计分组分析 3 复杂查询 sql面试题 topN问题 4 多表查询 面试题类型总结 这类题目属于行列如何互换 解题思路如下 其他面试题 SQL基础知识整理 se
  • html点击收缩展开菜单栏,jquery实现可点击伸缩与展开的菜单效果代码

    本文实例讲述了jquery实现可点击伸缩与展开的菜单效果代码 分享给大家供大家参考 具体如下 这是一款jquery实现的点击伸缩与展开的菜单代码 操作方式大家都知道吧 点击一下展开二级菜单的内容 再次点击则合拢 很经典的折叠菜单 运行效果截
  • Spark一路火花带闪电——Pair RDD常用算子(参数及其返回值)探究

    文章目录 转化算子 行动算子 转化算子 以键值对集合 1 2 3 4 3 6 为例 RDD U T 注意下面的函数 对应U和T reduceByKey f T T gt T RDD U T 合并具有相同值的键 rdd reduceByKey
  • 学生信息管理系统(c语言版)

    大一下C语言要交课程设计 于是就写了一个学生信息管理系统 仅供参考 学生信息包括姓名 学号 性别 年龄和各科成绩 可根据需要自行修改添加 包括增 删 改查 查看所有 保存 清空7个功能 每个功能都封装成一个函数 保存功能是将所添加的信息保存
  • 使用 js 实现 队列

    队列是一种特殊的列表 队列只能在队尾插入元素 在队首删除元素 队列用于存储按顺序排列的数据 先进先出 参数 接收的参数为数组类型 属性及方法 栈的抽象数据类型定义 列表 属性或方法 描述 enqueue 方法 向队尾加入一个元素 deque