总结前端常用数据结构 之 队列篇【JavaScript 】

推动你的事业,不要让你的事业推动你。——爱因斯坦

目录

  • 队列是什么?
  • JS异步、事件循环、任务队列:
  • 队列的实现方法:
    • ‌数组实现‌ - 封装队列:
    • 对象实现(优化性能)- 封装队列:
  • 队列应用之击鼓传花:

队列是什么?

队列是一种线性表,它只允许在表的一端进行插入操作,而在另一端进行删除操作。 其中,允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。即先进先出!【FIFO - first in first out】。队列中没有元素时,称为空队列。

JS异步、事件循环、任务队列:

点击跳转 - JS同步任务、异步任务(宏任务和微任务)
在这里插入图片描述
提示:上图是b站 千锋教育 课程里的图,侵权请联系删除。

队列的实现方法:

‌数组实现‌ - 封装队列:

使用 push() 和 shift() 方法实现入队和出队操作。

class Queue {#item = [];dequeue () {this.#item.shift();}enqueue (val) {this.#item.push(val);}front () {return this.#item.at(0);}isEmpty () {return this.#item.length === 0;}size () {return this.#item.length;}clear () {this.#item = [];}toString () {return this.#item.join("");}}let queue = new Queue();

对象实现(优化性能)- 封装队列:

数组的 shift() 方法时间复杂度为 O(n),通过对象存储和头尾指针优化出队性能至 O(1)‌。

class Queue {#items = {};#count = 0;#lowcount = 0;dequeue () {if (this.isEmpty()) {return;}let res = this.#items[this.#lowcount];delete this.#items[this.#lowcount];this.#lowcount++;return res;}enqueue (val) {this.#items[this.#count] = val;this.#count++;}front () {return this.#items.at(0);}isEmpty () {return this.size() === 0;}size () {return this.#count - this.#lowcount;}clear () {this.#items = {};this.#lowcount = 0;this.#count = 0;}toString () {let str = '';for (let i = this.#lowcount; i < this.#count; i++) {str += `${this.#items[i]} `}return str;}}let queue = new Queue();

队列应用之击鼓传花:

击鼓传花游戏通常是指一群人围成一圈传递物品,当鼓声停止时,持有物品的人被淘汰,直到剩下最后一人。
解题思路:

  • 队列循环逻辑‌:当队列长度大于1时,持续将队首元素移动到队尾,每轮循环次数由参数num决定‌。‌
  • 淘汰规则‌:每轮循环结束后(即完成num次移动),移除当前队首元素‌。
  • 终止条件‌:当队列仅剩一个元素时,返回该元素及其在原数组中的索引‌。

使用js代码解决:

class Queue {#items = {};#count = 0;#lowcount = 0;dequeue () {if (this.isEmpty()) {return;}let res = this.#items[this.#lowcount];delete this.#items[this.#lowcount];this.#lowcount++;return res;}enqueue (val) {this.#items[this.#count] = val;this.#count++;}front () {return this.#items.at(0);}isEmpty () {return this.size() === 0;}size () {return this.#count - this.#lowcount;}clear () {this.#items = {};this.#lowcount = 0;this.#count = 0;}toString () {let str = '';for (let i = this.#lowcount; i < this.#count; i++) {str += `${this.#items[i]} `}return str;}}function game (list, num) {let queue = new Queue();for (let i = 0; i < list.length; i++) {queue.enqueue(list[i]);}while (queue.size() > 1) {for (let i = 0; i < num; i++) {queue.enqueue(queue.dequeue())}console.log(queue.dequeue(), '淘汰了');// queue.dequeue();}console.log('获胜的是:', queue.dequeue());// return queue.dequeue();}game(['kitty', 'Alice', 'AK', 'Box', 'Whe'], 7);

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

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

相关文章

C# 数据转换

1. 文本框读取byte&#xff0c;ushort格式数据 byte addr; if (byte.TryParse(textBoxAddr.Text, out addr) true) {}2. 字节数组 (byte[]) 转换为 ASCII 字符串 byte[] bytes { 72, 101, 108, 108, 111 }; // "Hello" 的 ASCII 码 string s0 Encoding.ASCII.Ge…

golang部分语法介绍(range关键字,函数定义+特性,结构体初始化+结构体指针/方法)

目录 golang语法 range关键字 介绍 使用 原理 函数 介绍 定义 特性 结构体 介绍 初始化 结构体指针 结构体方法 方法接收者 golang语法 range关键字 介绍 用于遍历数组&#xff08;array&#xff09;、切片&#xff08;slice&#xff09;、映射&#xff08;ma…

Linux与UDP应用1:翻译软件

UDP应用1&#xff1a;翻译软件 本篇介绍 本篇基于UDP编程接口基本使用中封装的服务器和客户端进行改写&#xff0c;基本功能如下&#xff1a; 从配置文件dict.txt读取到所有的单词和意思客户端向服务端发送英文服务端向客户端发送英文对应的中文意思 配置文件内容 下面的内…

【机器学习】逻辑回归(Logistic Regression)

逻辑回归 逻辑回归逻辑回归的流程Sigmoid函数Sigmoid函数的公式及图像 逻辑回归的损失函数与最优化求解逻辑回归使用梯度下降法求解 逻辑回归 逻辑回归与线性回归都是线性模型&#xff0c;其中线性回归使用线性式来预测数值&#xff0c;逻辑回归使用线性式来进行分类任务。 逻…

IDEA - 查看类的继承结构(通过快捷键查看、通过生成类图查看)

一、通过快捷键查看 在项目中定位到目标类&#xff08;例如&#xff0c;Executor.java&#xff09; 按下快捷键 【Ctrl H】 此时会弹出 Type Hierarchy 窗口&#xff0c;展示所有相关的父类、子类、接口 二、通过生成类图查看 在项目中定位到目标类&#xff08;例如&#x…

Leetcode-1776. Car Fleet II [C++][Java]

目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-1776. Car Fleet IIhttps://leetcode.com/problems/car-fleet-ii/description/ 一、题目描述 There are n cars traveling at different speeds in the same direction along a one-lane road. You are given an …

《Python实战进阶》No 9:使用 Celery 实现异步任务队列

第9集&#xff1a;使用 Celery 实现异步任务队列 引言 在现代 Web 应用中&#xff0c;许多操作&#xff08;如发送邮件、处理文件上传、执行复杂计算等&#xff09;可能需要耗费较长时间。如果这些操作直接在主线程中执行&#xff0c;会导致用户请求阻塞&#xff0c;降低用户体…

ue5 创建多列StreeView的方法与理解

创建StreeView的多列样式怎么就像是创建单行单列差不多?貌似就是在单行单列中加入了多列widget? 目录结构: 必备条件 StreeView的多列创建需要的必备条件: 数据基类 CustomItemBase #pragma once /* ---------------------------------- | Name | Value …

Spring的下载与配置

1. 下载spring开发包 下载地址&#xff1a;https://repo.spring.io/webapp/#/artifacts/browse/simple/General/libs-release-local/org/springframework/spring 打开之后可以看到有很多版本供选择&#xff0c;因为视频教程用的是4.2.4版本&#xff0c;于是我也选择这个 右键…

Python + requests实现接口自动化框架

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 为什么要做接口自动化框架 1、业务与配置的分离 2、数据与程序的分离&#xff1b;数据的变更不影响程序 3、有日志功能&#xff0c;实现无人值守 4、自动发送测…

Linux——基本指令

我们今天学习Linux最基础的指令 ls 指令 语法&#xff1a; ls [选项] [⽬录或⽂件] 功能&#xff1a;对于⽬录&#xff0c;该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件&#xff0c;将列出⽂件名以及其他信 息。 命令中的选项&#xff0c;一次可以传递多个 &#xff0c…

【Godot4.3】自定义简易菜单栏节点ETDMenuBar

概述 Godot中的菜单创建是一个复杂的灾难性工作&#xff0c;往往无从下手&#xff0c;我也是不止一次尝试简化菜单的创建。 从自己去年的发明“简易树形数据”用于简化Tree控件获得灵感&#xff0c;于是尝试编写了用于表示菜单数据的EasyMenuData类&#xff0c;以及对应的纯文…

esp32串口通信

1、查看esp32的引脚图&#xff0c;寻找对应的串口 根据原理图&#xff0c;芯片上有3个串口(UART0, UART1和UART2)&#xff0c;但是UART1没有引出引脚。其中UART0&#xff08;GPIO3用于U0RXD&#xff0c;GPIO1用于U0TXD&#xff09;用作下载、调试串口&#xff0c;引脚不可改变&…

内部静态类和非内部静态类的区别

目录 问题&#xff1a; 原理&#xff1a; 外部类与非内部静态类 外部类与静态内部类 加载顺序 总结&#xff1a; 1.非静态内部类依赖于外部类的实例&#xff0c;而静态内部类不依赖于外部类的实例。 2.非静态内部类可以访问外部类的实例变量和方法&#xff0c;而静态内部…

Redis分布式锁的实现(Redission)

写在前面 本人在学习Redis过程中学习到分布式锁时太多困惑和疑难杂点 需要总结梳理思路 以下思路都是最简单最基本的思路 主要用到Redission工具类 会涉及到看门狗机制等 本文内容部分引自Javaguide,小林coding等热门八股 用于个人学习用途 分布式锁介绍 对于单机多线程来说…

【愚公系列】《Python网络爬虫从入门到精通》038-SQLite数据库

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

【开源免费】基于SpringBoot+Vue.JS网络海鲜市场系统(JAVA毕业设计)

本文项目编号 T 222 &#xff0c;文末自助获取源码 \color{red}{T222&#xff0c;文末自助获取源码} T222&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

JDK17安装方法/如何安装JDK17/环境变量配置

双击安装 我们这里安装jdk17 然后更改jdk目录 jdk环境变量配置 右键——>此电脑——>高级系统设置——>环境变量 当前用户的环境变量&#xff0c;另外有一个系统变量。 一般我们配置系统环境变量 一、配置JAVA_HOME 这里我们配置一个JAVA_HOME 我这里先前的jdk…

python集合set的常用方法

目录 集合的定义 集合的基础操作 多个集合之间的操作 集合的for循环 集合的定义 集合的基础操作 集合.add(元素) 添加新元素 集合.pop() 从集合中随机取出一个元素 集合.clear() 清空集合 集合.remove(元素) 移除元素 #定义集合,集合自动去重了 set1{"春"…

看得见摸得着的AI:具身智能

“如果Siri有手有脚&#xff0c;你的生活会变成什么样&#xff1f;” 想象一下&#xff1a; • 你家的扫地机器人不再横冲直撞&#xff0c;而是像猫咪一样轻巧绕过桌脚 • 手机里的语音助手能“摸”到你发烧的额头&#xff0c;主动帮你叫医生 • 工厂里的机械臂会边干活边学习&…