js实现数据结构--队列
队列的概念:
队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项。队列在尾部添加新元素,并在头部移除元素,队列的元素也可以是任何类型的。
队列的特点:
先进先出,最新添加的元素必须排在队列的末尾,最先移除的元素必须是头部第一个元素
生活中的队列:
在电影院, 自助餐厅, 杂货店收银台,我们所排成的队伍就是队列,排在第一位的人会先接受服务
js语法定义队列及队列的基本方法:
首先是创建一个类来表示一个队列,从基本的属性,方法的声明开始,代码如下:
//声明栈和栈的属性和方法function Queue() {this.items = [];//保存队列中元素的数组this.enqueue = enqueue;//进队列(从尾部进)this.dequeue = dequeue;//出队列(从头部出)this.front = front;//队列中第一个元素this.size = size;//队列中的元素个数this.isEmpty = isEmpty;//判断队列中是否有元素this.print = print;//打印队列元素}
重写队列的相关方法,代码如下:
function enqueue(element) {//进队列this.items.push(element);}function dequeue() {//出队列return this.items.shift();}function front() {//查看队列头元素return this.items[0];}function isEmpty() {//队列判空return this.items.length == 0;}function size() {//查看队列内元素个数return this.items.length;}function print() {//打印队列的所有元素return this.items;}
使用队列:
首先我们需要初始化Queue类,然后验证一下队列是不是为空(输出是true,因为栈内没有添加元素),代码如下:
var queue = new Queue();//队列初始化console.log(queue.isEmpty());//输出true
元素进队列,代码如下:
queue.enqueue(2);//元素进队列queue.enqueue(3);
查看队列的对头元素,输出对列的所有元素和队列内的元素个数,代码如下:
console.log(queue.front());//输出2console.log(queue.size());//输出2console.log(queue.print());//输出[2,3]
队列元素出队列以及队列判空,代码如下:
queue.dequeue();console.log(queue.size());//输出1console.log(queue.isEmpty());//输出false
队列的应用:
1 优先队列:元素的添加和移除是基于优先级的,一个现实生活中的例子就是机场登机的顺序,头等舱和商务舱乘客的优先级要高于经济舱,甚至有些国家,老年人和孕妇(带小孩的妇女)登机时也享有优先权,还有就是医院候诊室,医生会优先处理病情比较严重的患者等等。
实现一个优先队列有这两种选项:设置优先级,然后正确的添加元素;或者用入列操作添加元素,然后按优先级移除它们,在我们的实例中会选择在正确的位置上添加元素,具体代码如下:
//优先队列方法,优先级越大,priority值越小function priorityQueue() {let priorityQueueItems = [];this.elelment = elementthis.enqueue = enqueue;this.printEle = printEle;//优先队列与默认的队列的区别是,每一个在优先队列中的元素除了元素本身还有该元素所对应的优先级function element(name, priority) {this.name = name;this.priority = priority;}//元素进队列,除了将队列放入队列尾部,还要将该元素的优先级存储起来function enqueue(na, pri) {let queue_Element = new element(na, pri);let added = false;/*如果队列为空就直接将元素放入队列中,否则就需要比较该元素和其他元素的优先级,当找到一个比要添加* 的元素的priority值更大(优先级更低)的项时,就把新元素插到它之前(根据这个逻辑,对于优先级相同,* 但是先添加的元素,同意遵循先进先出的原则)* */for (var i = 0; i < priorityQueueItems.length; i++) {if (queue_Element.priority < priorityQueueItems[i].priority) {priorityQueueItems.splice(i, 0, queue_Element);added = true;break;}}//如果要添加的元素的priority的值大于任何已有的元素,就把它添加到队列的末尾即可if (!added) {priorityQueueItems.push(queue_Element);}}function printEle() {return priorityQueueItems}}let priority_Queue = new priorityQueue();priority_Queue.enqueue('John', 2);priority_Queue.enqueue('Tom', 1);priority_Queue.enqueue('Jack', 1);console.log(priority_Queue.printEle());
最后输出的结果如下图:
2 循环队列--击鼓传花:另一个修改版的队列实现,就是循环队列。一个简单的例子就是击鼓传花游戏,该例子中,孩子们围成一个圆圈,把花传给旁边的人。某个时刻传花停止,这个时候花在谁手里,谁就退出圆圈结束游戏,重复这个过程,直到剩下一个孩子,具体代码实现如下:
//队列应用 击鼓传花function Queue() {this.items = [];//保存队列中元素的数组this.enqueue = enqueue;//进队列(从尾部进)this.dequeue = dequeue;//出队列(从头部出)this.size = size;//队列中的元素个数}function dequeue() {//出队列return this.items.shift();}function enqueue(element) {//进队列this.items.push(element);}function size() {//查看队列内元素个数return this.items.length;}function hotPotato (nameList, num) {let queue = new Queue();for (let i = 0; i < nameList.length; i++ ){queue.enqueue(nameList[i]);}let eliminated ='';while (queue.size() > 1){for (let j = 0;j <num; j++){queue.enqueue(queue.dequeue());}eliminated = queue.dequeue();console.log(eliminated + '在击鼓传花游戏中被淘汰');}return queue.dequeue();}let names = ['John','Jack','Camila','Ingrid','Carl'];let winner = hotPotato(names,7);console.log('The winner is'+ winner);
输出结果如下图:
js实现数据结构--队列相关推荐
- JS版数据结构第三篇(链表)
链表分为单链表,双链表,以及环形链表,我将分三个模块分别介绍,并有相应的题目对应讲解. 单链表 定义 还是按照老规矩先看一下百度百科对单链表的定义 根据以上文字我们可以得出 单链表是一种链式的数据结构 ...
- js 延迟几秒执行_深入研究 Node.js 的回调队列
队列是 Node.js 中用于有效处理异步操作的一项重要技术. 在本文中,我们将深入研究 Node.js 中的队列:它们是什么,它们如何工作(通过事件循环)以及它们的类型. Node.js 中的队列是 ...
- JavaScript数据结构——队列(Queue)
概念和结构 队列是一种先进先出(FIFO)的数据结构. 队列的第一个元素所在位置称为队头,最后一个元素所在位置称为队尾. 不包含任何元素的队列称为空队列. 队列的操作 队列有五种常用操作,分别为 入队 ...
- 再谈js对象数据结构底层实现原理-object array map set
2019独角兽企业重金招聘Python工程师标准>>> 如果有java基础的同学,可以回顾下<再谈Java数据结构-分析底层实现与应用注意事项>:java把内存分两种:一 ...
- java 数据结构_Java版-数据结构-队列(数组队列)
前言 看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!! 由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现, ...
- 数据结构——队列的C++实现
数据结构--队列的C++实现 \qquad队列的创建.判断是否为空或者满.入队和出队操作的C++实现. #include<iostream> using namespace std;//1 ...
- java 数据队列_Java 数据结构 - 队列
Java 数据结构 - 队列 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的. 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构.使用队列时,在一端插入元素,而在另一 ...
- 数据结构队列代码_代码简介:队列数据结构如何工作
数据结构队列代码 Here are three stories we published this week that are worth your time: 这是我们本周发布的三个值得您关注的故事 ...
- js中数据结构数组Array、映射Map、集合Set、对象、JSON
全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js中数据结构 js中原生自带的数据结构比较简单,主要有数组Array.映射Map.集合Set.我们可以根据这三个基本数据结构实 ...
最新文章
- springboot No Java compiler available for configuration options compilerClassName
- EditPlus注册码在线生成,强大
- asp html转word文档,asp生成word文档
- 创建LEANGOO账号
- 在c语言中输入三个数据类型,【C语言讲解】第二章:数据类型3
- CentOS7和win7双系统启动项
- [转载] Python 统计学习方法——kdTree实现K近邻搜索
- size ar objdump readelf binutils
- python3 json文件_Python3读写JSON文件
- Java 拾遗补阙 ----- 数据类型
- matlab2015使用dsolve错误,matlab - 当变量乘以常数时,dsolve中的错误(R2011a) - 堆栈内存溢出...
- 投票系统(投票问题可多选、带柱状图)
- 每当我夜深人静的时候下载小电影,总是会卡在百分之九十九,这是正义的制裁么?
- first season twenty-second episode,the color(yellow) dream???
- 第三阶段:1.数据分析:2.定性定量数据分析
- 仿网易云音乐网站(加入个人社区)
- vue 生成 证书模板 并支持 图片下载和导出PDF的demo
- 安装xmanager linux系统,xmanager linux版
- code first修改表或字段
- 浅谈Java中类的相关内容
热门文章
- 90%的人都有的图表使用误区,赶紧看看自己是否中招
- 如今是云散雪消花残月缺
- 在 DataList 和 Repeater 控件中定制按钮46
- 利用python解决指派问题(匈牙利算法)
- java基础static变量初始化和赋值的例子
- 无线充电鼠标垫 B.FRIENDit壁虎忍者MP20办公游戏鼠标垫 RGB发光电竞防滑加厚鼠标垫黑色
- 计算机毕业设计PHP高校自习室座位网上预约小程序(源码+程序+uni+lw+部署)
- SpringBoot集成JmsTemplate(队列模式和主题模式)(xml和JavaConfig配置实现)
- 如何理解用户行为分析里的Session
- 【day4-c\c++入门-三子棋游戏】