js(JavaScript)数据结构之队列(Queue)

什么是数据结构?

下面是维基百科的解释:

数据结构是计算机存储、组织数据的方式。数据结构意味着接口或封装:一个数据结构可被视为两个函数之间的接口,或者是由数据类型联合组成的存储内容的访问方法封装。

我们每天的编码中都会用到数据结构,下面是常见的数据结构:

  • 数组(Array)
  • 栈(Stack)
  • 队列(Queue)
  • 链表(Linked List)
  • 散列表(Hash)
  • 字典
  • 树(Tree)
  • 图(Graph)
  • 堆(Heap)

队列(Queue)

队列是一种数据结构,它遵循先进先出(FIFO)的原则,即最先进入队列的元素最先被移除。在日常生活中,我们可以将队列比喻为排队等待服务的人群,如在银行排队或者日常购物排队。

队列的特点:

  1. 只能在队尾添加元素,在队首删除元素。
  2. 先进先出的原则。
  3. 适用于需要按照时间顺序处理的场景。

队列的常用方法:

  • enqueue(item): 向队列尾部添加一个或多个新的项。
  • dequeue(): 移除队列的第一个项,并返回被移除的元素。
  • head(): 返回队列第一个元素,队列不做任何变动。
  • tail(): 返回队列最后一个元素,队列不做任何变动。
  • isEmpty(): 队列内无元素返回 true,否则返回 false。
  • size(): 返回队列内元素个数。
  • clear(): 清空队列。

队列的实现:

下面是使用 JavaScript 实现的队列类:

class Queue {constructor() {this._items = [];}enqueue(item) {this._items.push(item);}dequeue() {return this._items.shift();}head() {return this._items[0];}tail() {return this._items[this._items.length - 1];}isEmpty() {return !this._items.length;}size() {return this._items.length;}clear() {this._items = [];}
}

队列的应用:

1. 约瑟夫环(Josephus Problem)

当涉及到JS队列的应用,Josephus问题是一个很好的例子。该问题描述了一群人(或者其他实体)站成一个圆圈,从某个人开始,每次数到第k个人,就将该人从圆圈中删除,然后从下一个人开始继续这个过程,直到只剩下一个人为止。

以下是一个JavaScript的解决方案:

function josephus(n, k) {let queue = [];for (let i = 1; i <= n; i++) {queue.push(i);}let result = [];while (queue.length > 0) {for (let j = 0; j < k - 1; j++) {queue.push(queue.shift());}result.push(queue.shift());}return result;
}console.log(josephus(7, 3)); // 输出[3, 6, 2, 7, 5, 1, 4]

思路过程和详细备注:

  1. 首先创建一个队列,其中包含1到n的所有人(编号)。
  2. 创建一个结果数组来存储被删除的人的顺序。
  3. 使用while循环,直到队列为空为止。
  4. 在内部循环中,每次将队首元素移动到队尾,模拟数到第k个人的过程。
  5. 当数到第k个人时,将其从队列中移除,并添加到结果数组中。
  6. 最终返回结果数组,即为最后留下的人的顺序。

这段代码使用了队列的先进先出特性来模拟Josephus问题。

2. 菲波那切数列(Fibonacci Sequence)

以下是一个使用JavaScript实现菲波那切数列的代码:

function fibonacci(n) {let queue = [];queue.push(0);queue.push(1);for (let i = 2; i <= n; i++) {let first = queue.shift();let second = queue[0];queue.push(first + second);}return queue[1];
}console.log(fibonacci(10)); // 输出55

思路过程和详细备注:

  1. 创建一个队列,并将0和1分别放入队列中,这是菲波那切数列的起始点。
  2. 使用循环从2开始直到n,每次取出队首的元素(第一个数字),然后取出当前队首的元素(第二个数字)。
  3. 将这两个数字相加得到新的数字,将其放入队列的末尾。
  4. 继续循环,重复上述步骤,直到计算到第n个菲波那切数。
  5. 返回队列中第二个元素,即为第n个菲波那切数。

这段代码利用队列的先进先出特性来按顺序计算菲波那切数列。

3. 用队列实现一个栈

以下是使用队列实现栈的JavaScript代码:

class QueueStack {constructor() {this.queue = [];}push(x) {const tempQueue = [x];while (this.queue.length) {tempQueue.push(this.queue.shift());}this.queue = tempQueue;}pop() {return this.queue.shift();}top() {return this.queue[0];}empty() {return this.queue.length === 0;}
}const stack = new QueueStack();
stack.push(1);
stack.push(2);
console.log(stack.top()); // 输出2
console.log(stack.pop()); // 输出2
console.log(stack.empty()); // 输出false

思路过程和详细备注:

  1. 创建一个名为QueueStack的类,该类使用一个数组作为队列。
  2. push方法将元素添加到栈中。它创建一个临时队列,将新元素放在队列的最前面,然后将原队列中的元素逐个取出并放入临时队列,以此来模拟栈的“先进后出”行为。
  3. pop方法从队列中移除并返回位于队首的元素,模拟栈的弹出操作。
  4. top方法返回栈顶元素,即队列的第一个元素。
  5. empty方法检查栈是否为空,如果队列的长度为0,则为空。

这段代码展示了如何使用队列来模拟栈的行为,实现了栈的基本功能。

用两个队列实现一个栈。
以下是使用两个队列实现栈的JavaScript代码:

class QueueStack {constructor() {this.queue1 = [];this.queue2 = [];}push(x) {this.queue2.push(x);while (this.queue1.length > 0) {this.queue2.push(this.queue1.shift());}[this.queue1, this.queue2] = [this.queue2, this.queue1];}pop() {return this.queue1.shift();}top() {return this.queue1[0];}empty() {return this.queue1.length === 0;}
}const stack = new QueueStack();
stack.push(1);
stack.push(2);
console.log(stack.top()); // 输出2
console.log(stack.pop()); // 输出2
console.log(stack.empty()); // 输出false

思路过程和详细备注:

  1. 创建一个名为QueueStack的类,该类使用两个数组作为队列。
  2. push方法将元素添加到栈中。它首先将新元素放入queue2队列,然后将queue1队列中的所有元素逐个取出并放入queue2队列,以此来模拟栈的“先进后出”行为。
  3. push方法中,交换queue1queue2的引用,以便下一次push操作可以在不同的队列上执行。
  4. pop方法从queue1队列中移除并返回位于队首的元素,模拟栈的弹出操作。
  5. top方法返回栈顶元素,即queue1队列的第一个元素。
  6. empty方法检查栈是否为空,如果queue1队列的长度为0,则为空。

这段代码展示了如何使用两个队列来模拟栈的行为,实现了栈的基本功能。

总结

当使用JavaScript中的队列时的注意事项:

  1. 先进先出(FIFO): 队列是一种先进先出的数据结构,这意味着最先进入队列的元素将会最先被移除。

  2. 数组和链表: 在JavaScript中,队列可以使用数组或者自定义的链表来实现。使用数组可能更为简单,但在频繁的插入和删除操作中,链表可能更高效。

  3. 队列方法: JavaScript的Array类提供了用于模拟队列行为的方法,如push(入队),shift(出队),unshift(在队首添加元素)等。

  4. 性能考虑: 在处理大量数据时,需要谨慎选择数据结构和相应的操作,以避免性能问题。

  5. 并发操作: 在多线程或异步编程中,队列经常用于控制任务执行的顺序,需要注意线程安全和同步问题。

  6. 应用场景: 队列常用于广度优先搜索、缓存、消息传递等场景,因此需要根据具体的应用需求来选择合适的队列实现方式。

  7. 内存管理: 使用队列时需要留意内存管理,避免出现内存泄漏或不必要的资源占用问题。

  8. 错误处理: 在队列操作时,需要考虑边界条件和异常情况,确保代码能够正确处理各种情况下的输入。

总的来说,队列在JavaScript中有着广泛的应用,但在使用时需要考虑算法复杂度、数据规模、并发操作等方面的因素,以确保代码的性能和可靠性。

持续学习总结记录中,回顾一下上面的内容:
队列(Queue):队列是一种数据结构,它遵循先进先出(FIFO)的原则,即最先进入队列的元素最先被移除。在日常生活中,我们可以将队列比喻为排队等待服务的人群,如在银行排队或者日常购物排队。
队列的特点:
只能在队尾添加元素,在队首删除元素。
先进先出的原则。
适用于需要按照时间顺序处理的场景。
队列的常用方法:
enqueue(item): 向队列尾部添加一个或多个新的项。
dequeue(): 移除队列的第一个项,并返回被移除的元素。
head(): 返回队列第一个元素,队列不做任何变动。
tail(): 返回队列最后一个元素,队列不做任何变动。
isEmpty(): 队列内无元素返回 true,否则返回 false。
size(): 返回队列内元素个数。
clear(): 清空队列。
队列的应用:约瑟夫环(Josephus Problem)、菲波那切数列(Fibonacci Sequence)、用队列实现一个栈。
当使用JavaScript中的队列时,队列的注意事项。

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

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

相关文章

掌控电路之源:电子元器件中的开关探秘

在电子元器件中&#xff0c;开关是一种非常重要的组成部分&#xff0c;它能够控制电路的接通和断开&#xff0c;从而实现电路的各种功能。开关的作用是控制电流的通断&#xff0c;从而控制电路中的信号和能量的流动。本文将介绍电子元器件中开关的类型、作用和特点。 开关可以…

debug OpenBLAS library 和 应用示例

1. 构建openblas lib git clone gitgithub.com:OpenMathLib/OpenBLAS.git cd OpenBLAS/ 如果要安装在自定义文件夹中&#xff0c;可以修改 PREFIX 的定义&#xff1a; 将 PREFIX /opt/OpenBLAS 修改成 PREFIX ../local/ 然后构建&#xff1a; make -j make install 如果要…

基于filter的内存马

主要是通过过滤器来拦截severlet请求中的参数&#xff0c;作为过滤器中的参数&#xff0c;来调用自定义过滤器中的恶意函数 在这里我们分析一下filter的实现原理&#xff0c;循序渐进 Demo1&#xff1a; 直接使用filter模拟内存马效果&#xff1a; 1.配置一个简单的severlet的…

推荐VSCODE插件:为`package.json`添加注释信息

众所周知&#xff0c;JSON文件是不支持注释的&#xff0c;除了JSON5/JSONC之外&#xff0c;我们在开发项目特别是前端项目时&#xff0c;大量会用到JSON文件&#xff0c;特别是在编写package.json中的scripts时&#xff0c;由于缺少注释,当有大量的命令脚本时&#xff0c;就有了…

aigc 启动器 sd-webui-aki-v4 decode_base64_to_file

下载地址&#xff1a; SD-WebUI启动器 绘世-启动器 | 万物档案 decode_base64_to_file报错&#xff1a; File "E:\BaiduNetdiskDownload\stable diffusion\sd-webui-aki-v4\extensions\sd-webui-controlnet\scripts\external_code.py", line 7, in <module>fr…

Js进阶31-DOM 操作专题

1. JavaScript 的组成部分&#xff1a; ECMAScript&#xff1a;简称 ES&#xff0c;它是欧洲计算机协会&#xff0c;大概每年的六月中旬定制语法规范。DOM&#xff1a;全称 Document Object Model&#xff0c;即为文档对象类型。BOM&#xff1a;全称 Browser Object Model&…

给自己创建的GPTs添加Action(查天气)

前言 在这篇文章中&#xff0c;我将分享如何利用ChatGPT 4.0辅助论文写作的技巧&#xff0c;并根据网上的资料和最新的研究补充更多好用的咒语技巧。 GPT4的官方售价是每月20美元&#xff0c;很多人并不是天天用GPT&#xff0c;只是偶尔用一下。 如果调用官方的GPT4接口&…

WebGL兼容性检查

引入文件WebGL.js class WebGL {static isWebGLAvailable () {try {const canvas document.createElement(canvas);return !!(window.WebGLRenderingContext && (canvas.getContext(webgl) || canvas.getContext(experimental-webgl)));} catch (e) {return false;}}…

Qt中QGraphicsView总体架构学习

前沿 前段时间学习了下如何在QGraphicsView架构中绘制刻度尺&#xff0c;主要是与OnPainter中进行比较的&#xff0c;那么今天就来详细讲解下我对QGraphicsView框架的认知吧~ 最近一段时间想学习下&#xff0c;如果我有不正确的&#xff0c;欢迎留言探讨哟~ QGraphicsView架…

[软件工具]AI软件离线表格识别工具使用教程图像转excel转表格可复制文字表格导出实时截图识别成表格

【官方框架地址】 https://github.com/PaddlePaddle/PaddleOCR.git 【算法介绍】 PaddleOCR是一个基于PaddlePaddle框架的开源光学字符识别&#xff08;OCR&#xff09;工具库&#xff0c;由百度公司开发。它提供了一套完整的OCR解决方案&#xff0c;包括文字检测、文字识别以…

使用 Apache PDFBox 操作PDF文件

简介 Apache PDFBox库是一个开源的Java工具&#xff0c;专门用于处理PDF文档。它允许用户创建全新的PDF文件&#xff0c;编辑现有的PDF文档&#xff0c;以及从PDF文件中提取内容。此外&#xff0c;Apache PDFBox还提供了一些命令行实用工具。 Apache PDFBox提供了创建、渲染、…

linux环境安装docker

一、Docker是什么? 当我们开发一个应用程序时&#xff0c;通常需要配置和安装各种软件、库和依赖项。而这些环境配置可能会因为不同的操作系统或版本而存在差异&#xff0c;导致应用在不同环境中运行出现问题。 Docker就像是一个集装箱&#xff0c;可以将应用程序及其所有依…

Java EE 博客系统(Servlet版)

文章目录 1. 基本情况2. 准备工作3. 博客列表页4. 博客详情页5. 实现登录6. 强制要求登录7. 显示用户信息8. 退出登录9. 发布博客10. 如果程序出现问题怎么办&#xff1f; 1. 基本情况 这里的博客系统主要是四个界面 博客列表页 显示出当前网站上都有哪些博客博客详情页 点击…

浅析ARMv8体系结构:A64指令集

文章目录 A64指令编码格式加载与存储指令寻址模式变基模式前变基模式后变基模式 PC相对地址模式 伪指令加载与存储指令的变种不同位宽的加载与存储指令多字节内存加载和存储指令基地址偏移量模式前变基模式后变基模式 跳转指令返回指令比较并跳转指令 其它指令内存独占访问指令…

面试题:MySQL误删表数据,如何快速恢复丢失的数据?

相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求&#xff0c;如果手法很稳那么很庆幸可以很快完成任务&#xff0c;很不幸某一天突然手一抖把表里的数据修改错误或者误删了&#xff0c;这个时候你会发现各种问题反馈接踵而来。 如果身边有BDA或者有这方面经…

Kubernetes WebHook 入门 -- 入门案例: apiserver 接入 github

博客原文 文章目录 k8s 集群配置介绍Admission WebhookWebHook 入门实践: github 认证接入web 服务器Dockerfile 镜像制作amd64x86_64构造镜像检验镜像 Makefilewebhook 接入 apiserverwebhook.yamlapiserver 挂载 webconfig在 github 中创建认证 token将 token 添加到 kubecon…

AI绘画:Midjournety的使用体验

今天的时间少&#xff0c;没有给大家做一些教程&#xff0c;就单纯分享使用体验&#xff0c;还不错&#xff0c;体验感很好。 后需如果有需要&#xff0c;我可以出一些教程类的视频。 下面是一组复刻fated的saber的一组提示词&#xff0c;效果相当不错。我后续会分享一些学习经…

ai电话呼叫系统的功能有哪些,能帮到我们什么?呼叫系统

人工智能产品的研发&#xff0c;是为了帮助企业更好的生存&#xff0c;更好的利润放大&#xff0c;而不是用于不正规的工作&#xff0c;现在的电话呼叫中心软件让企业员工从简单重复的工作中得以解放&#xff0c;那电话呼叫系统的强大功能有哪些&#xff1f; 知识自学习&#x…

目标检测-One Stage-YOLOx

文章目录 前言一、YOLOx的网络结构和流程1.YOLOx的不同版本2.Yolox-Darknet53YOLOv3 baselineYolox-Darknet53 3.Yolox-s/Yolox-m/Yolox-l/Yolox-x4.Yolox-Nano/Yolox-Tiny 二、YOLOx的创新点总结 前言 根据前文CenterNet、YOLOv4等可以看出学界和工业界都在积极探索使用各种t…

【Proteus仿真】【Arduino单片机】汽车车窗除霜系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LCD1602显示模块、光线传感器、DS18B20温度传感器、PCF8691 ADC模块、继电器加热模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD…