《数据结构与算法JavaScript描述》队列(学习笔记C05)

手把手教你用 JavaScript 实现常见数据结构与算法 你是否遇到过这样的场景?写前端代码时想优化列表渲染性能,却不知道用链表还是数组更高效;面试时被问“用 JS 实现一个栈”,结果卡壳在 API 设计;想自己写个小框架,却对虚拟 DOM 的树结构遍历一头雾水?本文正是为解决这些问题而生:覆盖6 类核心数据结构(数组、链表、栈、队列、树、图)和5 大经典算法(排序、搜索、递归、动态规划、贪心),用 JS 代码+生活案例,让你“既能写代码,又懂为什么这么写”。本文从“生活场景”切入,先讲数据结构(像认识工具),再讲算法(像学习工具的用法),最后用实战案例串联。 阅读详情

相关概念

队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。
队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。
入队操作在队尾插入新元素,出队操作删除队头的元素。
peek()读取队头的元素。

代码

// 队列--先进先出--FIFO
// 常规操作:
// 入队
// 出队
// 返回队头元素 peek()
// length
// clear()
// 底层实现结构--数组
// 数组: push() 末尾添加元素
// 数组: shift() 开头删除元素

// 定义Queue类构造函数
function Queue() {
    this.dataStore = []
    this.enqueue = enqueue // 向队尾添加一个元素
    this.dequeue = dequeue // 删除队首的元素
    this.front = front // 读取队首元素
    this.back = back // 读取队尾元素
    this.toString = toString // 显示队列所有元素
    this.empty = empty // 判断队列是否为空
    this.count = count
}
// enqueue()
function enqueue(element) {
    this.dataStore.push(element)
}
// dequeue()
function dequeue() {
    return this.dataStore.shift()
}
// 读取队首和队尾元素
// front()
function front() {
    return this.dataStore[0]
}
// back()
function back() {
    return this.dataStore[this.dataStore.length-1]
}
// toString()显示队列内所有元素
function toString() {
    var retStr = ''
    for (var i = 0; i< this.dataStore.length; ++i) {
        retStr += this.dataStore[i] + '\n'
    }
    return retStr
}
// empty()
function empty() {
    if (this.dataStore.length == 0) {
        return true
    } else {
        return false
    }
}
// 测试代码一
 var q = new Queue()
 q.enqueue('xx1')
 q.enqueue('xx2')
 q.enqueue('xx3')
 console.log('q.toString() ', q.toString())
 q.dequeue()
 console.log('q.toString() ', q.toString() )
 console.log('Front of queue ', q.front())
 console.log('Back of queue ', q.back())  

// 使用队列解决问题

// **1.方块舞的舞伴分配问题**

var list = [
    'F Allison McMillan',
    'M Frank Opitz',
    'M Mason McMillan',
    'M Clayton Ruff',
    'F Cheryl Ferenback',
    'M Raymond Williams',
    'F Jennifer Ingram',
    'M Bryan Frazer',
    'M David Durr',
    'M Danny Martin',
    'F Aurora Adney'
]
// 每个舞者的信息都被存储再一个Dancer对象中
function Dancer (name, sex) {
    this.name = name
    this.sex = sex
}
// 读取舞者信息生成相应队列
function getDancers(males, females) {
    var names = list
    for (var i = 0; i < names.length; ++i) {
        var dancer = names[i].split(' ')
        var sex = dancer[0]
        var name = dancer[1]
        if (sex == 'F') {
            femaleDancers.enqueue(new Dancer(name, sex))
        } else {
            maleDancers.enqueue(new Dancer(name, sex))
        }
    }
}
// 组成舞伴,宣布配对
function dance(males, females) {
    while (!females.empty() && !males.empty()) {
        var arr = []
        person = females.dequeue()
        arr.push(person)
        person = males.dequeue()
        arr.push(person)
        console.log('arr', arr)
    }
}
// 测试代码二
var maleDancers = new Queue()
var femaleDancers = new Queue()
getDancers(maleDancers, femaleDancers)
dance(maleDancers, femaleDancers)
 if (!femaleDancers.empty()) {
     console.log(femaleDancers.front().name + ' is waiting to dance.')
 }
 if (!maleDancers.empty()) {
     console.log(maleDancers.front().name + ' is waiting to dance.')
 }

 if (!femaleDancers.empty()) {
     console.log(femaleDancers.count() + ' is waiting to dance.')
 }
 if (!maleDancers.empty()) {
     console.log(maleDancers.count() + ' is waiting to dance.')
 }
// 显示数目
function count() {
    return this.dataStore.length
}
 if (femaleDancers.count() > 0) {
     console.log("There are " + femaleDancers.count() + " female dancers waiting to dance.")
 }
 if (maleDancers.count() > 0) {
     console.log("There are " + maleDancers.count() + " male dancers waiting to dance.")
 }

// **2.使用队列对数据进行排序**

// 传入数组,队列,数字个数,个位还是十位排
function distribute(nums, queues, n, digit) {
    for (var i = 0; i< n; ++i) {
        if (digit == 1) {
            // 按个位排推进队列
            queues[nums[i]%10].enqueue(nums[i])
        } else {
            // 按十位排推进队列
            queues[Math.floor(nums[i]/10)].enqueue(nums[i])
        }
    }
}
// 将生成的队列按顺序整理成数组
function collect(queues, nums) {
    var i = 0
    for (var digit = 0; digit < 10; ++digit) {
        while (!queues[digit].empty()) {
            nums[i++] = queues[digit].dequeue()
        }
    }
}
// 按顺序输出元素
function dispArray(arr) {
    for (var i = 0; i < arr.length; ++i) {
        console.log(arr[i] + ' ')
    }
}

var queues = []
for (var i = 0; i < 10; ++i) {
    queues[i] = new Queue()
}
var nums = []
for (var i = 0; i < 10; ++i) {
    nums[i] = Math.floor(Math.floor(Math.random()*101))
}

console.log("Before radix sort: ");
dispArray(nums);
distribute(nums, queues, 10, 1);
collect(queues, nums);
distribute(nums, queues, 10, 10);
collect(queues, nums);
console.log("\n\nAfter radix sort: ");
dispArray(nums);

// **3.优先队列**

// 不懂为什么先删除jane,jane的code为4

// 优先队列不必先进先出

// 重写dequeue()--找出优先码最低的患者
function dequeue() {
    var priority = this.dataStore[0].code
    for (var i = 1; i < this.dataStore.length; ++i) {
        if (this.dataStore[i].code < priority) {
            priority = i
        }
    }
    return this.dataStore.splice(priority, 1)
}

// toString()显示Patient对象
function toString() {
    var retStr = ''
    for (var i = 0; i < this.dataStore.length; ++i) {
        retStr += this.dataStore[i].name + ' code: '
               + this.dataStore[i].code + '\n'
    }
    return retStr
}

var p = new Patient('Smith', 5)
var ed = new Queue()
ed.enqueue(p)
p = new Patient('Jones', 4)
ed.enqueue(p)
p = new Patient("Fehrenbach", 6);
ed.enqueue(p)
p = new Patient("Brown", 1);
ed.enqueue(p)
p = new Patient("Ingram", 1);
ed.enqueue(p)
console.log(ed.toString())
var seen = ed.dequeue()
console.log("Patient being treated: " + seen[0].name)
console.log("Patients waiting to be seen: ")
console.log(ed.toString())

// 下一轮
var seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ")
console.log(ed.toString());
var seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ")
console.log(ed.toString());

function Patient(name, code) {
    this.name = name
    this.code = code
}

2024年最全数据结构与算法:终于可以用三种语言(C,C#,JavaScript,斩获offer 队列在C语言上只能自己构造,好在我们前面有链表、有顺序表,我们可以复制过来一个链表程序构造一个队列,于是从链表程序中复制过来b5.c或者b6.c即可,我们分析队列的ADT可知,最需要的队列功能需求是:修改的这个链表结点函数、仅仅加了第14行,在过去,所以结点删除后,最后的尾巴结点指针Tail所指的存储空间被释放,导致这个指针变量不可用,现在在结点个数为0的情况下,再次让尾结点指向头结点,保证下次进入链表的数据依然正确。补充main()函数,测试多批次进入队列、出队列,全部程序见B0.c。 阅读详情

相关推荐

JavaScript迷宫生成与解决的算法实践

要开始使用JavaScript,首先需要设置一个合适的开发环境。对于Web开发,常用的文本编辑器如Visual Studio Code,Sublime Text或Atom都提供了丰富的插件支持和便捷的编码体验。安装Node.js后,可以使用npm(Node包管理器)来管理项目依赖,并用Webpack或Babel等工具进行模块打包和语法转换。

weixin_42509507的博客 1000

Javascript描述-数据结构与算法

☆     数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。      下面是我总结整理出的关于数据结构与算法的相关内容,如有错误,欢迎交流。本文中对于方法的封装均采用JavaScript语言来实现。...

weixin_43689100的博客 402

基于Halcon与C#的PCB焊接缺陷智能检测系统开发实战(附完整源码与项目文档)

本文详细介绍了基于Halcon与C#的PCB焊接缺陷智能检测系统开发实战,涵盖机器视觉技术、硬件选型、图像处理算法及C#上位机开发。通过实战案例展示如何实现高效、准确的PCB焊接缺陷检测,提升生产效率与质量,并附完整源码与项目文档。

mango的博客 218

资料分享:送你一本《数据结构与算法JavaScript描述》电子书!

数据结构 是掌握计算机编程必须具备的技能。通常情况下,我想掌握一门编程语言所用的方法就是利用这门语言把数据结构中线性表、栈、队列、字符串、动态数字、整数集合、树、图、搜索、排序等涉及的算法全部写一遍。写完之后,基本上就把这门语言搞定了。 今天给大家分享的就是我从网上找到的利用 JavaScript 语言来实现各种数据结构的算法,希望这本电子书对学习 JavaScript 想从事前端工作的读者有益。...

老马的程序人生 4380

Solidworks转URDF避坑实录:从履带机器人到ROS仿真的完整配置流程

本文详细介绍了将Solidworks履带机器人模型转换为URDF格式并配置ROS仿真的完整流程,重点解析了坐标系设置、复杂关节定义、插件配置等关键步骤中的常见问题与解决方案,帮助开发者高效实现履带机器人在RVIZ和Gazebo中的精确仿真。

weixin_30693683的博客 457

hi3516cv610在PQStream上实现拉出图像,windows和板端操作记录

PQStream拉出图像

weixin_51838255的博客 728

【数据结构与算法】多种语言(VB、C、C#、JavaScript)系列数据结构算法经典案例教程合集目录

文章目录1. 专栏简介2. 专栏地址3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之《数据结构与算法》 3. 专栏目录 【经典回放】多种语言系列数据结构算法:二叉树(JavaScript版) 【经典回放】多种语言系列数据结构算法:二叉树(C#版) 【经典回放】多种语言系列数据结构算法:树(C#、JavaScript、VB6版) 【经典回放】多种语言系列数据结构线性表之一:顺序表 【经典回放】多种语言系列数据结构线性表之二:链表 【经典回放】多种语言系列数据结构算法:串(C

智慧空间实验室 814

STM32家电安全开发实战:手把手教你用X-CUBE-CLASSB通过IEC60730 Class B认证

本文详细解析了如何使用STM32的X-CUBE-CLASSB软件包通过IEC60730 Class B认证,涵盖认证核心要求、软件包架构、工程集成配置及调试技巧。针对家电安全开发,提供了从单元测试到压力测试的全流程方案,帮助开发者快速实现符合国际安全标准的嵌入式控制系统。

pink的博客 706

【数据结构与算法学习笔记】

本系列文章为作者学习数据结构与算法所作笔记,笔记参考陈斌老师的课程“数据结构与算法 Python版”和经典的数据结构教材《数据结构(C语言版)》(作者:严蔚敏),后期也参考了LetCode的题解。

floating_heart的博客 3101

基于CatBoost回归模型的完整预测分析:从建模到SHAP可解释性分析

本文介绍了使用CatBoost回归模型进行完整预测分析的流程。首先导入必要的Python库并加载数据,进行数据预处理包括训练测试集划分和归一化处理。然后通过网格搜索优化CatBoost超参数,使用最优参数训练模型并评估预测性能。结果显示模型具有较高的决定系数(R²=0.9944)和较低的误差指标(RMSE=0.0696)。接着进行残差分析和正态性检验,发现残差基本服从正态分布。最后通过SHAP分析实现模型可解释性,识别关键特征影响。该方法为梯度提升树在回归问题中的应用提供了完整解决方案。

fx666_的博客 746

ImportError: cannot import name ‘is_torch_npu_available‘ from ‘transformers.utils‘解决方案

本文主要介绍了ImportError: cannot import name ‘is_torch_npu_available’ from 'transformers.utils’解决方案,希望能对使用transformers的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 4万+

JS数据结构: 队列

与栈一样,队列(Queue) 也是线性表的一种特殊情况,与栈不同的是:队列是限制在两端进行操作的线性表,只允许在一端进行插入数据元素,而另一端删除数据元素,是先进先出(FIFO,fist in first out) 模式。

Preshine 660

ESP32-IDF开发之旅 网络篇⑩ Web配网

本文介绍了基于ESP32S3的Web配网实现方案。作者通过移植开源项目,在ESP32S3上实现了WiFi配置功能,包括AP模式创建、HTTP服务器搭建、NVS存储读写等核心功能。文章详细解析了代码结构,包含WiFi初始化、事件处理、NVS存储管理和HTML页面服务等关键模块。实现方案采用AP+STA双模式,支持通过网页扫描WiFi并保存配置信息,适用于物联网设备的网络配置场景。代码中使用了FreeRTOS任务、ESP-IDF事件组等技术,并提供了完整的错误处理和日志记录功能。

单片机菜鸟哥的博客 350

Javascript数据结构与算法

文章目录Javascript数据结构与算法什么是数据结构与算法线性结构数组数组使用的API链表链表原理自定义链表双向链表栈自定义栈栈常见的操作栈的封装栈的应用十进制转二进制队列自定义队列队列常见的操作队列的封装优先级队列队列的应用哈希表哈希表理论认识哈希表认识哈希化地址的冲突哈希表效率自定义哈希表哈希函数哈希表实现哈希扩容树结构树相关的概念树的基本概念二叉树的概念二叉搜索树图结构排序&搜索...

MOOG007的博客 368

若依开源系统多数据源整合clickhouse数据库详细步骤

若依开源系统多数据源整合clickhouse数据库详细步骤

java之书-资源 897

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)

文章目录邻接矩阵存储图的广度优先遍历过程分析C语言实现队列编程程序中加入图的处理函数结果的再次分析C#语言实现图的广度优先遍历、并显示广度优先遍历生成树JavaScript语言实现图的广度优先遍历、并显示广度优先遍历生成树 邻接矩阵存储图的广度优先遍历过程分析 对图1这样的无向图,要写成邻接矩阵,则就是下面的式子 一般要计算这样的问题,画成表格来处理是相当方便的事情,实际中计算机处理问题,也根本不知道所谓矩阵是什么,所以画成表格很容易帮助我们完成后面的编程任务。在我们前面介绍的内容中,有不少是借助着表格完

智慧空间实验室 5480

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java数据结构和算法 day01 稀疏数组与队列

文章目录第一章 数据结构和算法概述几个经典的算法面试题数据结构和算法的重要性数据结构与算法框架数据结构和算法的关系(了解!!!)编程中实际遇到的几个问题(了解)线性结构和非线性结构第二章 稀疏数组与队列稀疏数组的应用场景稀疏数组转换的思路分析及实现队列的应用场景和介绍数组模拟队列的思路分析及实现数组模拟环形队列思路分析及实现Leetcode每日一练[1. 两数之和](https://leetcode-cn.com/problems/two-sum/)[5. 最长回文子串](https://leetcode-

杨丙寅 6810

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JavaScript实现数据结构与算法(二)线性结构

JavaScript实现数据结构与算法(二)线性结构 目录 1. 重要性 2. 线性结构【本文】 3. 哈希表 4. 树结构 5. 图结构 6. 排序和搜索 2. 线性结构 2.1 数组的特点 2.1.1 普通数组 优点:通过下标取元素效率非常高。 缺点:常见语言数组不能存放不同类型的数据,所以一般都先封装一个Object类型 2.1.2 底层数组 扩容方法:新建一个大的数组,把原有数组写进去,再...

weixin_43545225的博客 1700

【数据结构与算法——TypeScript】数组、栈、队列、链表

什么是算法(Algorithm)?算法(Algorithm)的认识:解决问题的过程中,不仅仅 数据的存储方式会影响效率,算法的优劣也会影响效率;前端算法学习:**算法的通俗**理解 - **Algorithm**这个单词本意就是 **解决问题的办法/步骤逻辑**。 - **数据结构的实现,离不开算法**。

羊羊羊羊羊羊羊的博客 1710

Javascript算法和数据结构

什么是算法和数据结构 数据结构:计算机中存储和组织数据的方式 算法:解决办法的逻辑/操作 数组 JS数组就是API的调用 栈 栈是受限的线性结构:(生活中类似于自助餐的托盘) 只能在一端添加/删除元素(栈顶) 进入:进栈(压栈) 出去:出栈(退 栈) 函数调用栈 A调用B,B调C,C调D D,C,B,A的弹栈顺序 一个栈结构面试题 有6...

大灰狼的小绵羊哥哥的博客 965

JavaScript栈与队列:从数据结构到事件循环的实战指南

栈和队列是计算机科学中两种基础且关键的线性数据结构,它们分别遵循后进先出和先进先出的操作原则。栈的核心在于管理具有嵌套或回溯性质的操作,其经典应用包括函数调用栈和括号匹配算法;而队列则擅长处理需要按序执行的任务,如消息传递和异步调度。理解这两种数据结构的原理,对于编写高效、健壮的代码至关重要,尤其是在处理递归、异步编程等复杂场景时。在JavaScript中,栈和队列不仅是算法面试的常客,更是深入理解事件循环、任务队列等运行时机制的基础。本文将通过具体的代码实现和常见应用场景,如函数调用栈、事件循环中的任务队

优快云头条 721

【实战】JavaScript版数据结构与算法 —— 课程导学

文章目录一、前端刚需二、快速入门三、课程内容介绍四、课程特色五、适用对象六、注意事项 JavaScript版数据结构与算法-慕课网实战 一、前端刚需 前端开发门槛低、人员参差不齐 前端开发只会写页面,不懂算法,伪程序员 面试考算法,通过率极低 看过C、C++、Java版算法,JavaScript版的却不会写 程序 = 算法 + 数据结构 二、快速入门 通过“解题”夯实基础算法 理解算...

程序边界 1043

视频教程-C语言开发之数据结构与算法一-C/C++

C语言开发之数据结构与算法一 从事技术开发已经10年左右,拥有丰富的开发经验...

weixin_31769585的博客 718

JS数据结构和算法、javascript数据结构实现

JS数据结构和算法 栈 后进先出,新元素都靠近栈顶 栈也被用在编程语言的编译器和内存中保存变量、方法调用等,也被用于浏览器历史记录 数组实现 用数组保存栈里的元素 对元素的插入和删除功能进行限制,使其遵循LIFO 实现以下方法 push pop peek isEmpty clear size class Stack{ constructor() { this.items = [] } push = el => { this.items.push(el) } pop =

qq_43271330的博客 239

JavaScript 数据结构与算法之美 - 强烈推荐 GitHub 上值得前端学习的数据结构与算法项目

前言 算法为王。 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手;只有内功深厚者,前端之路才会走得更远。 强烈推荐 GitHub 上值得前端学习的数据结构与算法项目,包含 gif 图的演示过程与视频讲解。 GitHub 项目 数据结构与算法 关于数据结构与算法的 GitHub 项目,star 数由高到低排序。 javascript-algorithms(...

嘿嘿 1224

JavaScript数据结构与算法(4)栈和队列

1.

yangyang的专栏 234
上一篇: 《数据结构与算法JavaScript描述》栈(学习笔记C04)
下一篇: 《数据结构与算法JavaScript描述》链表(学习笔记C06)
magic-fish
博客等级 码龄9年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值