JavaScript数据结构与算法(三) 优先级队列的实现
TypeScript方式实现源码
// Queue类和PriorityQueue类实现上的区别是,要向PriorityQueue添加元素,需要创建一个特殊的元素。这个元素包含了要添加到队列的元素(它可以是任意类型)及在队列中的优先级
class QueueElement {
element;
priority;
constructor(element, priority) {
this.element = element;
this.priority = priority;
}
}
class PriorityQueue {
items = [];
public enqueue(element, priority) {
let queueElement = new QueueElement(element, priority); if (this.isEmpty()) {
this.items.push(queueElement);
} else {
let added = false;
for (let i = ; i < this.items.length; i++) {
if (queueElement.priority < this.items[i].priority) {
this.items.splice(i, , queueElement);
added = true;
break;
}
}
if (!added) {
this.items.push(queueElement);
}
}
}
public dequeue() {
return this.items.shift();
}
public front() {
return this.items[];
}
public isEmpty() {
return this.items.length == ;
}
public clear() {
this.items = [];
}
public size() {
return this.items.length;
}
public print() {
console.log(this.items.toString());
}
}
// 使用方法
let priorityQueue = new PriorityQueue();
priorityQueue.enqueue('John', );
priorityQueue.enqueue('Jack', );
priorityQueue.enqueue('Camila', );
priorityQueue.print(); // 下图中可以看到每条命令的结果
JavaScript方式实现源码
var QueueElement = (function () {
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
return QueueElement;
}());
var PriorityQueue = (function () {
function PriorityQueue() {
this.items = [];
}
PriorityQueue.prototype.enqueue = function (element, priority) {
var queueElement = new QueueElement(element, priority);
if (this.isEmpty()) {
this.items.push(queueElement);
}
else {
var added = false;
for (var i_1 = ; i_1 < this.items.length; i_1++) {
if (queueElement.priority < this.items[i_1].priority) {
this.items.splice(i_1, , queueElement);
added = true;
break;
}
}
if (!added) {
this.items.push(queueElement);
}
}
};
PriorityQueue.prototype.dequeue = function () {
return this.items.shift();
};
PriorityQueue.prototype.front = function () {
return this.items[];
};
PriorityQueue.prototype.isEmpty = function () {
return this.items.length == ;
};
PriorityQueue.prototype.clear = function () {
this.items = [];
};
PriorityQueue.prototype.size = function () {
return this.items.length;
};
PriorityQueue.prototype.print = function () {
console.log(this.items.toString());
};
return PriorityQueue;
}());
代码角度解读:
PriorityQueue对比Queue.PriorityQueue为每个队列元素包裹了一个对象,该对象用于优先级的标记,添加时会对队列中所有数据进行便利计算.其他使用接口一致
抽象:
优先队列的应用场景非常多比如排队买票、地铁安检、飞机登机、任务计划、项目排期.等等都是队列,优先队列是对队列的扩展,比如排队买票只有一个窗口,出于人道主义,
老人与小朋友可以优先.这时优先队列便可以将他们安排到队列前面
总结:
当Queue能解决应用场景问题时不推荐使用PriorityQueue,以此来优化内存开支
JavaScript数据结构与算法(三) 优先级队列的实现的更多相关文章
- java数据结构与算法值优先级队列
一.优先级队列 什么是优先级队列:优先级队列是一种比栈和队列更加常用的一种数据结构.在优先级队列中,数据项按照关键字的值有序.数据项插入到队列中时,会按照顺序插入到合适的位置,用来保证队列的顺序. 生 ...
- JavaScript数据结构与算法(四) 循环队列的实现
实现击鼓传花,需要用到上一章所述队列类Queue TypeScript方式实现源码 let hotPotato = (nameList, num) => { let queue = new Qu ...
- 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列
定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- 为什么我要放弃javaScript数据结构与算法(第四章)—— 队列
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第四章 队列 队列数据结构 队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序 ...
- 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第三章 栈 栈数据结构 栈是一种遵循后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- JavaScript数据结构与算法-队列练习
队列的实现 // 队列类 function Deque () { this.dataStore = []; this.enqueueFront = enqueueFront; this.enqueue ...
- 重读《学习JavaScript数据结构与算法-第三版》-第2章 ECMAScript与TypeScript概述
定场诗 八月中秋白露,路上行人凄凉: 小桥流水桂花香,日夜千思万想. 心中不得宁静,清早览罢文章, 十年寒苦在书房,方显才高志广. 前言 洛伊安妮·格罗纳女士所著的<学习JavaScript数据 ...
随机推荐
- STL --> 高效使用STL
高效使用STL 仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍: 熟悉以下条款,高效的使用STL: 一.当对象很大时,建立指针的容器而不是对象的容器 1)STL基于拷贝的方式的来工作,任 ...
- OpenStreetMap、googleMap等经纬度和行列号之间相互转化
# OpenStreetMap经纬度转行列号 def deg2num(lat_deg, lon_deg, zoom): lat_rad = math.radians(lat_deg) n = 2.0 ...
- 微信公众平台开发,模板消息,网页授权,微信JS-SDK,二维码生成(4)
微信公众平台开发,模板消息,什么是模板消息,模板消息接口指的是向用户发送重要的服务通知,只能用于符合场景的要求中去,如信用卡刷卡通知,购物成功通知等等.不支持广告营销,打扰用户的消息,模板消息类有固定 ...
- alpha冲刺第六天
一.合照 二.项目燃尽图 三.项目进展 主界面首页内容呈现 我的栏目之我的问题完成 我的栏目之我的提问完成 还是插不进去,然后打算先放一放,一直在一个地方纠结那么久脑子太乱 四.明日规划 问答界面问题 ...
- c语言第1次作业
一.PTA实验作业 题目1:7-3 温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1 ...
- Archlinux安装和使用技巧
一 准备工作 1 文件下载及启动盘制作 文件可以在https://mirrors.ustc.edu.cn/,这是个中科大的镜像网,选择如下: 下载完成后,就是制作一个启动盘,我使用的是Linux下强 ...
- Python 图片转字符画
Python 图片转字符画 一.课程介绍 1. 课程来源 原创 2. 内容简介 本课程讲述怎样使用 Python 将图片转为字符画 3. 前置课程 Python编程语言 Linux 基础入门(新版) ...
- scrapy 模拟登陆
import scrapy import urllib.request from scrapy.http import Request,FormRequest class LoginspdSpider ...
- JavaScript 相关知识
一.数组 var a = [1,2,3,4]; console.log(a.length); a.push(5); console.log(a); // [1, 2, 3, 4, 5] var r ...
- 微信小程序轮播图
swiper标签 <!--index.wxml--> <swiper class="swiper" indicator-dots="true" ...
