JavaScript实现队列结构
一.什么是队列结构?
1.1.简介
队列(Queue),类似于栈结构,但又和栈结构不同
- 是一种运算受限的线性表,受限之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作
- 队列结构遵循先进先出(FIFO First In First Out),图解如下图:

这种结构类似生活中排队的例子:先排先出去

1.2.队列在程序中的应用
- 打印队列:优先放入的文档,优先被取出
- 线程队列:当进行多线程开发时,我们不可能无限制开启新的线程,这个时候使用线程队列,依次按照次序来启动线程并处理任务,减小处理器的压力
二.队列的实现
2.1.队列的封装
队列的操作:
- enqueue(element):向队列尾部添加一个(或多个)新的项。
- dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
- front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,* 只返回元素信息——与Stack类的peek方法非常类似)。
- isEmpty():如果队列中不包含任何元素,返回true,否则返回false。
- size():返回队列包含的元素个数,与数组的length属性类似。
完整封装代码:
// 封装队列类
function Queue() {
// 属性
this.items = []
// 方法
// 1.将元素加入到队列中
Queue.prototype.enqueue = function (element) {
this.items.push(element)
}
// 2.从队列中删除前端的元素
Queue.prototype.dequeue = function () {
return this.items.shift()
}
// 3.查看前端的元素
Queue.prototype.font = function () {
return this.items[0]
}
// 4.查看队列是否为空
Queue.prototype.isEmpty = function () {
return this.items.length == 0
}
// 5.查看队列中元素的个数
Queue.prototype.size = function () {
return this.items.length
}
// 6.toString方法
Queue.prototype.toString = function () {
var resultString = ''
this.items.forEach((element) => {
resultString += element + ' '
})
return resultString
}
}
测试代码:
// 使用队列
var queue = new Queue()
// 测试操作
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
console.log(queue.items) // [1,2,3]
queue.dequeue()
queue.dequeue()
console.log(queue.items) // [3]
console.log(queue.font()) // 3
console.log(queue.isEmpty()) // false
console.log(queue.size()) // 1
console.log(queue.toString()) // 3
2.2.队列的面试题(击鼓传花)
传入一组数据和设定的数字num,循环遍历数组内元素,遍历到的元素为指定数字num时将该元素删除,直至数组剩下一个元素
代码实现:
// 面试题:击鼓传花
function passGame(nameList, num) {
// 1.创建一个队列结构
var queue = new Queue()
// 2.将所有人加入到队列中
nameList.forEach((item) => {
queue.enqueue(item)
})
// 3.开始数数字
while (queue.size() > 1) {
// 不是num的时候,重新加入到队列末尾
// 是num的时候,将其从队列中删除
// 3.1.num数字之前的人重新放入到队列的末尾
for (var i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue())
}
// 3.2.num对应的这个人,直接从队列中删除
queue.dequeue()
// 思路:每次循环num-1次,当到num次时,队列前端是数据就是需要删除的数据
}
// 4.最后剩下的那个人
console.log(queue.size())
var endName = queue.font()
console.log('最终剩下的人是:' + endName)
return nameList.indexOf(endName)
}
测试代码:
// 测试击鼓传花
// names = ['张三', '李四', '王二', '张麻子']
// console.log(passGame(names, 3))

三.优先级队列
前面, 我们实现了一种普通的队列. 队列中元素的处理顺序和插入的顺序密切相关.
但是, 还有一种比较常见的场景是和插入顺序无关, 而和元素本身的优先级有关系的队列,这种队列就是优先级队列
优先级队列特点:
- 在插入一个元素的时候会考虑该数据的优先级
- 通过比较优先级, 可以得出这个元素正确的队列中的位置
代码实现:
function PriorityQueue() {
// 创建一个内部类 用于保存元素和元素的优先级
// priority 优先级 在本例子中是越小优先级越大
function QueueElement(element, priority) {
this.element = element
this.priority = priority
}
// 封装属性(可以使用链表)
this.items = []
// 1.实现插入方法
PriorityQueue.prototype.enqueue = function (element, priority) {
// 1.1.创建QueueElement对象
var queueElement = new QueueElement(element, priority)
// 1.2.判断队列是否为空
if (this.items.length === 0) {
this.items.push(queueElement)
} else {
var added = false
// 1.3.循环比较
for (let i = 0; i < this.items.length; i++) {
// 如果大于前一个的优先级
if (queueElement.priority < this.items[i].priority) {
// 插入
this.items.splice(i, 0, queueElement)
added = true
break
}
}
// 1.4.如果优先级还是最小,放到最后
if (!added) {
this.items.push(queueElement)
}
}
}
// 2.从队列中删除前端的元素
PriorityQueue.prototype.dequeue = function () {
return this.items.shift()
}
// 3.查看前端的元素
PriorityQueue.prototype.font = function () {
return this.items[0]
}
// 4.查看队列是否为空
PriorityQueue.prototype.isEmpty = function () {
return this.items.length == 0
}
// 5.查看队列中元素的个数
PriorityQueue.prototype.size = function () {
return this.items.length
}
// 6.toString方法
PriorityQueue.prototype.toString = function () {
var resultString = ''
for (let i = 0; i < this.items.length; i++) {
resultString +=
this.items[i].element + '-' + this.items[i].priority + '\n'
}
return resultString
}
}
测试代码:
// 测试代码
var pq = new PriorityQueue()
pq.enqueue('a', 2)
pq.enqueue('b', 4)
pq.enqueue('c', 1)
pq.enqueue('d', 3)
// 打印
console.log(pq.toString())
可以看到,输入的数据被按照优先级从大到下排列

四.总结
以上就是关于队列和其优先级队列的知识点,其实本质还是和栈结构一样都是受限的线性结构,栈是后进先出(LFIO),队列是先进先出(FIFO),一定要将二者结合起来理解!
JavaScript实现队列结构的更多相关文章
- JavaScript实现队列结构(Queue)
JavaScript实现队列结构(Queue) 一.队列简介 队列是是一种受限的线性表,特点为先进先出(FIFO:first in first out). 受限之处在于它只允许在表的前端(front) ...
- 数据结构与算法JavaScript (二) 队列
队列是只允许在一端进行插入操作,另一个进行删除操作的线性表,队列是一种先进先出(First-In-First-Out,FIFO)的数据结构 队列在程序程序设计中用的非常的频繁,因为javascript ...
- JavaScript实现栈结构(Stack)
JavaScript实现栈结构(Stack) 一.前言 1.1.什么是数据结构? 数据结构就是在计算机中,存储和组织数据的方式. 例如:图书管理,怎样摆放图书才能既能放很多书,也方便取? 主要需要考虑 ...
- JavaScript实现图结构
JavaScript实现图结构 一.图论 1.1.图的简介 什么是图? 图结构是一种与树结构有些相似的数据结构: 图论是数学的一个分支,并且,在数学中,树是图的一种: 图论以图为研究对象,研究顶点和边 ...
- 刚开始学python——数据结构——“自定义队列结构“
自定义队列结构 (学习队列后,自己的码) 主要功能:用列表模拟队列结构,考虑了入队,出队,判断队列是否为空,是否已满以及改变队列大小等基本操作. 下面是封装的一个类,把代码保存在myQueue.py ...
- Java实现队列结构的详细代码
一.什么是队列结构 一种线性结构,具有特殊的运算法则[只能在一端(队头)删除,在另一端(队尾)插入]. 分类: 顺序队列结构 链式队列结构 基本操作: 入队列 出队列 二.准备数据 static fi ...
- (js描述的)数据结构[队列结构,优先级队列](3)
(js描述的)数据结构[队列结构](3) 一.队列结构的特点: 1.基于数组来实现,的一种受限的线性结构. 2.只允许在表头进行删除操作,在表尾进行插入操作. 3.先进先出(FIFO) 二.队列的一些 ...
- JS数据结构与算法-队列结构
队列结构 一.认识队列 受限的线性结构: 我们已经学习了一种受限的线性结构:栈结构. 并且已经知道这种受限的数据结构对于解决某些特定问题,会有特别的 效果. 下面,我们再来学习另外一个受限的数据结构: ...
- javascript中的队列结构
1.概念 队列和栈结构不同,栈是一种后进先出的结构,而队列是一种先进先出的结构.队列也是一种表结构,不同的是队列只能在队尾插入元素,在队首删除元素,可以将队列想象成一个在超时等待排队付钱的队伍,或者在 ...
随机推荐
- WeChatSampleBuilder V2.0 使用教程(网页版+桌面版)
为了方便开发者可以快速搭建一个最小化所需模块的 Senparc.Weixin SDK Sample 项目,我们于 2018 年 11 月发布了首个 WeChatSampleBuilder 的版本,受到 ...
- SocksCap64应用程序通过SOCKS代理
一.下载SocksCap64 https://pan.baidu.com/s/1B671kT9R6Zb6ch1mc4Kb2Q 提取码:hai3 一个是免安装版本,一个是安装版本,选一个即可. 下面以免 ...
- #Week6 Neural Networks : Representation
一.Non-linear Hypotheses 线性回归和逻辑回归在特征很多时,计算量会很大. 一个简单的三层神经网络模型: \[a_i^{(j)} = \text{"activation& ...
- POJ - 2251 Dungeon Master(搜索)
You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...
- 8) drf 三大认证 认证 权限 频率
一.三大认证功能分析 1)APIView的 dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial(request, *ar ...
- C语言程序设计实验报告三
C程序设计实验报告 姓 名:张美盛 实验地点:家 实验时间:2020年3月29日 实验项目:4.3.1 If语句的应用 4.3.2 switch-case的应用 4.3.3 switch-case嵌套 ...
- P2774 方格取数问题 网络流
题目: P2774 方格取数问题 题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...
- Spring官网阅读(十八)Spring中的AOP
文章目录 什么是AOP AOP中的核心概念 切面 连接点 通知 切点 引入 目标对象 代理对象 织入 Spring中如何使用AOP 1.开启AOP 2.申明切面 3.申明切点 切点表达式 excecu ...
- Proteus传感器+气体浓度检测的报警方式控制仿真
Proteus传感器+气体浓度检测的报警方式控制仿真 目录 Proteus传感器+气体浓度检测的报警方式控制仿真 1 实验意义理解 2 主要实验器件 3 实验参考电路 4 实验中的问题思考 4.1 实 ...
- 记录一下关于在工具类中更新UI使用RunOnUiThread犯的极其愚蠢的错误
由于Android中不能在子线程中更新ui,所以平时在子线程中需要更新ui时可以使用Android提供的RunOnUiThread接口,但是最近在写联网工具类的时候,有时候会出现联网异常,这个时候为了 ...