数据结构(JS实现)——队列与优先级队列

华为OD机试详解:基于C++、Java、JavaScript和Python的打印机队列问题全解析 通过以上的不同语言实现,可以发现解决这个问题的关键在于使用合适的数据结构来管理打印机的任务队列。使用优先级队列可以高效地处理任务的优先级排序,同时也可以在任务到达顺序一致的情况下保证正确的输出顺序。 阅读详情

一.什么是队列

只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表;进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列);队列具有先进先出(FIFO)的特性。

二.队列的封装

我们封装队列常见方式有两种:

基于数组实现

基于链表实现

我们使用数组实现

  function Queue() {
    // 属性
    this.items = [];
    
    // 方法
    // enqueue(element): 向队列尾部添加一个新的项
    // dequeue(): 移除队列的第一项,并返回被移除的元素
    // front(): 返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动
    // isEmpty(): 判空
    // size(): 返回长度
    // tostring(): 输出

}

三、队列的常见的操作

enqueue(element):向队列尾部添加一个新的项

dequeue():移除队列的第一项,并返回被移除的元素

front():返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动

isEmpty():判空

size():返回长度

tostring():输出

3.1 enqueue(element):向队列尾部添加一个新的项

 Queue.prototype.enqueue = function (element) {
        this.items.push(element);
        return element;
    } 

3.2 dequeue():移除队列的第一项,并返回被移除的

 Queue.prototype.dequeue = function () {
        return this.items.shift();
    }

3.3 front():返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动

  Queue.prototype.front = function () {
        return this.items[0];
    }

3.4 isEmpty():判空

  Queue.prototype.isEmpty = function () {
        return this.items.length == 0;
    }

3.5 size():返回长度

  Queue.prototype.size = function () {
        return this.items.length;
    }

3.6 tostring():输出

  Queue.prototype.tostring = function () {
        var str='';
        for (let index = 0; index < this.items.length; index++) {
            str+=this.items[index]+' ';            
        }
        return str;
    }

四. 面试题:击鼓传花

/* 击鼓传花游戏,玩家按顺序从1开始数数,数到指定的num时出局 剩下的玩家接着重新从1开始数数 最后剩下的玩家获胜 */

 function passGame(nameList,num) {
        // 创建一个队列结构
        var list=new Queue();
        // 将所有人加入队列中
        for (let index = 0; index < nameList.length; index++) {
            list.enqueue(nameList[index])
        }
        
        while (list.size()!=1) {
            // 每次循环遍历nun,每遍历一个人将其从对头移至对位
            for (let i = 0; i <  num-1; i++) {
                list.enqueue(list.dequeue());
            }
            // 循环结束后将对头元素(即目标值)删除
            list.dequeue();
        }
        console.log(list.size());
        // 循环结束只剩下一个人就是target
        return list.front();
    }
    var names=["Lily","lucy","tom","Lilei","why"];
    
    console.log(passGame(names,3));

五. 优先级队列的封装

5.1概念

如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构。

5.2 封装

其实关于优先级队列的封装,大致思路和普通队列时相似的,只有添加方法需要考虑优先级的情况。

 function PriorityQueue() {
        // 属性封装
        var items=[];

        // 队列元素
        function QueueElement(element,priority) {
            this.element=element;
            this.priority=priority;
        }
        
        // 添加方法
        。。。
    }

5.3 添加方法

     PriorityQueue.prototype.enqueue = function (element, priority) {
            // 创建QueueElement对象
            var newQueueElement = new QueueElement(element, priority);
         //判断队列长度是否为空
            if (this.items.length == 0) {
                this.items.push(newQueueElement);
            } else {
                //不为空时我们遍历比较优先级插入即可
                //设置标记(如果比较完发现不符合条件,则说明不需要交换位置,则插入在队尾即可)
                var flag = false;
                
                for (let i = 0; i < this.items.length; i++) {
                    if (newQueueElement.priority < this.items[i].priority) {
                        this.items.splice(i, 0, newQueueElement);
                        flag = true
                        break;
                    }
                }
                if (!flag) {
                    this.items.push(newQueueElement);
                }
            }
        }

六.源码

队列:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
</body>
<script src="Queue.js"></script>
<script>
    function Queue() {
    // 属性
    this.items = [];
    // 方法
    // enqueue(): 向队列尾部添加一个新的项
    Queue.prototype.enqueue = function (element) {
        this.items.push(element);
        return element;
    } 
    // dequeue(): 移除队列的第一项,并返回被移除的元素
    Queue.prototype.dequeue = function () {
        return this.items.shift();
    }
    // front(): 返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动
    Queue.prototype.front = function () {
        return this.items[0];
    }
    // isEmpty(): 判空
    Queue.prototype.isEmpty = function () {
        return this.items.length == 0;
    }
    // size(): 返回长度
    Queue.prototype.size = function () {
        return this.items.length;
    }
    // tostring(): 输出
    Queue.prototype.tostring = function () {
        var str='';
        for (let index = 0; index < this.items.length; index++) {
            str+=this.items[index]+' ';            
        }
        return str;
    }
}
    var queue=new Queue();
    queue.enqueue('aa');
    queue.enqueue('bb');
    queue.enqueue('cc');
    queue.enqueue('dd');
    console.log(queue.tostring());
    queue.dequeue();
    console.log(queue.tostring());
    queue.dequeue();
    console.log(queue.tostring());
    console.log(queue.isEmpty());
    console.log(queue.size());
</script>
</html>

优先级队列:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    function PriorityQueue() {
        // 属性封装
        this.items = [];

        // 队列元素
        function QueueElement(element, priority) {
            this.element = element;
            this.priority = priority;
        }

        // 添加方法
        PriorityQueue.prototype.enqueue = function (element, priority) {
            // 创建QueueElement对象
            var newQueueElement = new QueueElement(element, priority);
            if (this.items.length == 0) {
                this.items.push(newQueueElement);
            } else {
                var flag = false;
                for (let i = 0; i < this.items.length; i++) {
                    if (newQueueElement.priority < this.items[i].priority) {
                        this.items.splice(i, 0, newQueueElement);
                        flag = true
                        break;
                    }
                }
                if (!flag) {
                    this.items.push(newQueueElement);
                }
            }
        }
        // dequeue(): 移除队列的第一项,并返回被移除的元素
        PriorityQueue.prototype.dequeue = function () {
            return this.items.shift();
        }
        // front(): 返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动
        PriorityQueue.prototype.front = function () {
            return this.items[0];
        }
        // isEmpty(): 判空
        PriorityQueue.prototype.isEmpty = function () {
            return this.items.length == 0;
        }
        // size(): 返回长度
        PriorityQueue.prototype.size = function () {
            return this.items.length;
        }
        // tostring(): 输出
        PriorityQueue.prototype.tostring = function () {
            var str = '';
            for (let index = 0; index < this.items.length; index++) {
                str += this.items[index].priority+","+this.items[index].element+ ' ';
            }
            return str;
        }
    }


    var nn=new PriorityQueue();
    nn.enqueue('aa',111);
    nn.enqueue('bb',200);
    nn.enqueue('cc',50);
    nn.enqueue('dd',66);
    console.log(nn.tostring());
</script>

</html>
华为OD机试详细解析:支持优先级的队列 - 基于C++、Java、JavaScript、Python四种语言的解题思路与实现 高优先级任务先出队;同优先级时先进先出;相同数据和优先级的任务不重复入队。 阅读详情

相关推荐

华为od统一考试B卷【打印任务排序】JavaScript 实现

某个打印机根据打印队列执行打印任务。打印任务分为九个优先级,分别用数字1-9表示,数字越大优先级越高。打印机每次从队列头部取出第一个任务A,然后检查队列余下任务中有没有比A优先级更高的任务,如果有比A优先级高的任务,则将任务A放到队列尾部,否则就执行任务A的打印。请编写一个程序,根据输入的打印队列,输出实际的打印顺序。

MISAYAONE的博客 5599

【前端】js实现队列功能 先进后出 先进先出 等

定义一个定时任务 不断的去取队列 执行。

我是Superman丶的博客 960

JS实现队列的先进先出功能示例

主要介绍了JS实现队列的先进先出功能,结合实例形式分析了基于JS的队列初始化、赋值等相关操作技巧,需要的朋友可以参考下

JavaScript数据结构与算法 -- 队列/优先级队列

1.队列结构 队列(Queue)结构是一种受限的线性表,先进先出(FIFO First In First Out) 受限之处在于,它只允许在表的前端(front)进行删除操作 在表的后端(rear)进行插入操作 2.生活中类似的队列结构 电影院,商场排队,游乐场排队买票 打印机打印文件 3.队列的应用 打印队列: 有五份文档需要打印,这些文档会按照次序放入到打印队列中 打印机会一次从队...

qq_43955202的博客 1190

excel 利用SUBTOTAL函数计算筛选后数列总和、均值、最大、最小值

表里有三个人,咱们需要筛选出三个人,并分别计算他们的总和值。 先看一下数据范围(A1:B27) 通过筛选找张三。 按照上图所示输入函数,选择9,求和。 然后按照函数输入即可。 就能计算出结果。 筛选项选择王五,就会自动计算王五的总和。 筛选到李四就会自动计算李四的总和。 如果把9改成1,就是自动计算筛选出来的均值结果,如下图所示。 如果改成4就是取筛选项的最大值,选择5就是取最小值。 ...

yuanYW7556的博客 3万+

数字信号的艺术演绎:用FPGA+DAC实现音乐合成器的核心原理

本文深入探讨了如何利用FPGA和DAC技术实现数字音乐合成器的核心原理,涵盖DDS架构、多波形合成、MIDI协议解析及动态包络控制等关键技术。通过详细的Verilog代码示例和硬件实现方案,展示了数字信号处理在音乐合成中的艺术演绎,为电子音乐创作提供了强大的硬件支持。

weixin_28256233的博客 390

在JavaScript中的数据结构(队列)

当我们在浏览器中打开新标签时,就会创建一个任务队列。这是因为每个标签都是单线程处理所有的任务,它被称为事件循环。浏览器要负责多个任务,如渲染HTML,执行JavaScript代码,处理用户交互(用户输入、鼠标点击等),执行和处理异步请求。队列(Queue)是一种具有先进先出(FIFO, First-In-First-Out)特性的数据结构,它可以用于在计算机程序中管理和存储元素。在JavaScript中,可以使用数组(Array)或链表(Linked List)等数据结构来实现队列。

肥晨开发的学习之路 2448

ArduSub程序学习(1)——ardupilot框架整理

AP_HAL层(硬件抽象层)是我们制作 ArduPilot 的方式可移植到许多不同的平台。有一个顶级AP_HAL libraries/AP_HAL,用于定义代码其余部分的接口 有针对具体的板子特性,然后就有了AP_HAL_XXX 子目录,例如,AP_HAL_AVR 用于基于 AVR 的 开发板,AP_HAL_PX4用于 Pixhawk 开发板和 AP_HAL_Linux 基于 Linux 开发板。工具目录tools directories工具目录是杂项支持目录。

weixin_49839886的博客 2816

js中 数组的操作 push(),pop(),shift(),unshift() 简介

js中 数组的操作 push(),pop(),shift(),unshift() 简介

蓝胖子的博客 1843

pycharm添加Anaconda解释器显示不出来

因为我之前下载的是pycharm最新版本2024.1的,所以我抱着试一试的心态卸载重装了2021.3.3的,创建新文件的时候立刻就自己识别好了conda环境。就是图中画圈的地方,之前一直显示为python的图标,但是再Python Interpreter后面跟的路径确实是我下载anaconda的地方。另外一种方法就是使用Virtualenv Environment方式配置,但是我的pycharm还是没有识别出conda的图标。首先是这位的方法,先添加系统解释器,再重启,但是我的图标还是python。

2202_75803271的博客 4006

【Anaconda】conda国内镜像源快速配置指南(清华/阿里云)

本文详细介绍了如何为Anaconda配置国内镜像源(清华/阿里云),以显著提升conda包下载速度并减少安装失败率。通过分步指南和实用技巧,帮助开发者快速完成配置,优化Python开发环境。

weixin_33725722的博客 1488

js 队列 先进先出

队列 function Queue() { // var items = [] window.items = [] // 方便调试 this.enqueue = function (e) { items.push(e) } this.dequeue = function (e) { return items.shift() } this.front = function (e) { return items[0] } t

qq_28918357的博客 543

abaqus热力耦合模拟教程学习笔记

学习资源:BV1je4y1a7Ku软件:abaqus2016以m为单位制。

qq_41900477的博客 2万+

数据结构与算法四(js 实现优先级队列)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>优先级队列</title> </head> <body> <script> //封装优先级队列 function pr...

ZhaiAlan的博客 643

深度学习笔记——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总

本文简要介绍深度学习的前向传播与反向传播,以及前馈神经网络与反馈神经网络。

haopinglianlian的博客 3044

三种方法教你下载大模型到本地,总有一种适合你

本文主要介绍了下载大模型到本地的三种解决方案,希望能对同学们有所帮助。 文章目录 1. 场景/问题描述 2. 方案一:使用git 3. 方案二:镜像站 4. 方案三:高速下载工具(变体及自定义代码) 4.1 aria2 4.2 自定义代码

weixin_43178406的博客 17万+

JavaScript数据结构与算法(三) 优先级队列的实现

TypeScript方式实现源码 1 // Queue类和PriorityQueue类实现上的区别是,要向PriorityQueue添加元素,需要创建一个特殊的元素。这个元素包含了要添加到队列的元素(它可以是任意类型)及在队列中的优先级 2 class QueueElement { 3 element; 4 priority; 5 construct...

weixin_30399155的博客 95

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数据结构(二)队列JS实现

数据结构(二)队列JS实现 特点 队列是是一种受限的线性表,特点为先进先出(FIFO:first in first out)。例如买票时的排队现象 元素只能从队列的头部(front)出去,队尾(rear)插入 队列的另一种形式:优先级队列 基于数组或链表实现 队列常见操作 enqueue():向队列尾部添加一个(或多个)新的项; dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素; front():返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做

qq_33811654的博客 190

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据结构1--栈和队列

栈 在栈顶删除和插入 后进先出 参考文章 //封装一个栈 function Stack(){ this.items = []; Stack.prototype.push = function(ele){ //向栈顶插入元素 this.items.push(ele); }; Stack.prototype.pop = functi...

weixin_42139212的博客 475

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JS中基于数组的队列结构

认识队列 栈,是一种比较高效的数据结构,遵循 先入后出(LIFO,last-in-first-out) 的原则。队列,它也是一种特殊的列表,它与栈不同的是, 队列只能在队尾插入元素,在队首删除元素,遵循 先进先出(FIFO,First-In-First-Out) 的原则,也是计算机常用的一种数据结构。 同栈有点类似,队列的操作主要也是有两种:向队列中插入新元素和删除队列中的元素,即入队和出队操作,我们采用 enqueue(element):入队 dequeue() :出队 front():返回队首元素,该

Tiger's blog 602

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

栈和队列是计算机科学中两种基础且关键的线性数据结构,分别遵循后进先出和先进先出的原则。理解其原理是掌握程序执行流程、内存管理和异步编程的基石。在JavaScript中,数组天然支持栈操作,而队列的高效实现则需考虑性能优化。栈的核心价值体现在函数调用栈的机制上,用于管理执行上下文;队列则广泛应用于任务调度,如浏览器事件循环中的宏任务与微任务队列。通过实现有效的括号匹配、回文检查器及模拟优先级队列等实战案例,开发者能将数据结构理论转化为解决实际工程问题的能力,例如优化递归调用、管理异步任务流以及构建高效的消息处

weixin_30698297的博客 397

华为OD机考C卷“面试叫号系统”:优先级队列与多窗口并发模拟详解

在软件工程与算法竞赛中,状态模拟类题目一直是考察开发者逻辑思维与工程落地能力的试金石。这类问题往往以现实业务场景为外壳,内部却隐藏着数据结构选型与并发状态流转的深层挑战。以“优先级队列”作为核心调度工具,结合“多窗口并发”的时间轴推进机制,能够高效模拟银行、政务大厅等场景下的叫号服务流程。通过定义VIP客户与普通客户的比较规则,利用最小堆实现公平与优先兼顾的排队策略,并借助离散事件模拟思想管理多个服务窗口的空闲与忙碌状态。这一技术路径不仅能解决具体的叫号系统问题,还能泛化至任务调度、资源分配等更广阔的领域。

weixin_28726671的博客 307

数据结构与算法-优先级队列

title: 数据结构与算法-优先级队列 date: 2020-06-11 21:30:37 tags: - 数据结构与算法 优先级队列 普通的队列插入一个元素,该元素位于最后端,在前面的数据都处理完后才会处理后插入的数据。 优先级队列在插入时会考虑该数据的优先级(在普通队列添加一个属性存储优先级) 在处理时根据优先级决定处理顺序,也就是根据优先级调整插入数据的位置 两个问题:1,元素多了一个优先级属性,这就需要用对象封装;2,入队时要比较插入位置 优先级队列数组实现 //优先级队列数组实现 .

weixin_44091205的博客 305

小顶堆 删除最小值维护_堆和二叉堆的实现和特性

堆 HeapHeap:可以迅速找到一堆数中的最大或者最小值的数据结构。将根节点最大的堆叫做大顶堆或大根堆,根节点最小的堆叫做小顶堆或小根堆。常见的堆有二叉堆、裴波那契堆等。堆本身是一个相对比较抽象的数据结构,那么它有具体的实现就分为二叉堆(二项堆、Binary)、裴波那契堆(基于树的)。那么要实现的话一般面试来说或者经常会用的话就是二叉堆来实现,当然在工业级比较牛逼的应用都是裴波那契以及...

weixin_39794213的博客 154

Javascript常见数据结构二——队列

Javascript常见数据结构二——队列,通过本节对队列的学习 ,您将收获js队列的基本概念、自定义队列、通过队列实现jq动画队列、双向队列、优先级队列、击鼓传花效果!

weixin_52624209的博客 462

栈 + 队列(简单版,用js的数组实现)+ 优先级队列 -- 大二上第四周

目录数据结构栈队列 数据结构 线性表可以用数组和链表来实现 目前的栈和队列的封装都是基于数组(因为js里面对于数组的函数有很多,在开始会比较容易) 栈 function Stack() { this.items = []; Stack.prototype.push = function (element) { this.items.push(element); } Stack.prototype.pop = function () { r

weixin_50948265的博客 268
上一篇: Javascript-关于闭包的理解
下一篇: 数据结构(JS实现)——栈的封装与应用
小牲口online
博客等级 码龄8年 116粉丝 68原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值