《学习JavaScript数据结构与算法》读书笔记。

队列是遵行FIFO(First In First Out, 先进先出)原则的一组有序的项。队列再尾部添加新元素,并从顶部移除元素。

在现实中,最常见的队列的例子就是排队。

1.创建队列

现在,我们来创建一个类来表示一个队列。先从最基本的声明类开始:

function Queue(){

// 这里是属性和方法

}

首先,需要一个用户存储队列中元素的数据结构,我们可以使用数组。

var items = [];

接下来,声明一些队列可用的方法:

enqueue(element(s)):进队,向队列尾部添加一个(或多个)新项。

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

front():返回队列中第一个元素-最先被添加,也会是最先被移除的元素。(只返回,不移除)。

isEmpty():如果队列为空,返回true,否则,返回false。

size():返回队列的长度。

首先,我们来实现enqueue的方法,这个方法负责向队列中添加新元素。只能是添加到队列的尾部。

this.enqueue = function(element) {

items.push(element);

}

接下来要实现的是dequeue方法,这个方法负责从队列移除项。由于队列遵循的是先进先出原则,所以最先移除的就是最先添加的,元素是排在数组的第一位。

this.dequeue = function() {

return items.shift();

}

只有enqueue方法和dequeue方法可以添加和移除元素,这样就确保了Queue类遵循先进先出原则。

现在来为我们的类实现一些额外的辅助方法:

// front():返回队列中第一个元素

this.front = function() {

return items[0];

}

// isEmpty():如果队列为空,返回true,否则,返回false

this.isEmpty = function() {

return items.length === 0;

}

// size():返回队列的长度

this.size = function() {

return items.length;

}

完成,我们的Queue类实现好了,现在来看看Queue完整的实现是怎么样的:

function Queue() {

var items = [];

this.enqueue = function(element) {

items.push(element);

}

this.dequeue = function() {

return items.shift();

}

this.front = function() {

return items[0];

}

this.isEmpty = function() {

return items.length === 0;

}

this.clear = function() {

items = [];

}

this.size = function() {

return items.length;

}

this.print = function() {

console.log(items.toString());

}

}

2.使用Queue类

var queue = new Queue();

console.log(queue.isEmpty()); // 输出 true

queue.enqueue('John'); // 添加元素 John

queue.enqueue('Jam'); // 添加元素 Jam

queue.enqueue('Camila'); // 添加元素 Camila

queue.print();

console.log(queue.size); // 输出 3

console.log(queue.isEmpty); // 输出 false

queue.dequeue(); // 移除元素

queue.dequeue();

queue.print();

运行上面的代码,我们可以看出,我们已经实现了队列,遵循了先入先出原则。

3.优先队列

上面我们已经实现了一个队列,现在,逐步深入,我们来看看什么是优先队列。

优先队列是默认队列的变种,它的元素的添加和移除是基于优先级的。一个现实的例子就是医院的(急诊科)候诊室。医生会优先处理病情比较严重的患者。

实现一个优先队列,有两种选择:设置优先级,然后在正确的位置添加元素;或者用默认入列操作添加元素,任何按照优先级移除它们。下面,我们将会在正确的位置添加元素,任何用默认你的出列操作。

function PriorityQueue() {

var items = [];

// {1}

function QueueElement(element, priority) {

this.element = element;

this.priority = priority;

}

this.enqueue = function(element, priority) {

var queueElement = new QueueElement(element, priority);

if(this.isEmpty()) {

items.push(queueElement); // {2}

} else {

var added = false;

for(var i = 0; i < items.length; i++) {

if(queueElement.priority < items.[i].priority) {

items.splice(i, 0, queueElement); // {3}

added = true;

break;

}

}

if(!added) { // {4}

items.push(queueElement);

}

}

}

// 其他方法与默认队列一样

}

我们创建了一个特殊的元素(行{1}),这个元素包含了要添加到队列的元素及其优先级。

如果队列为空,则直接将元素入列(行{2})。否则,就要进行比较。当找到一个比要添加的元素的priority值更大(优先级更低)时,就将元素插入到它之前(行{3})。

如果要添加的元素的priority指大于任何已有的元素,则直接将其添加到队列的末尾(行{4})。

var priorityQueue = new PriorityQueue();

priorityQueue.enqueue('John', 2);

priorityQueue.enqueue('Jam', 1);

priorityQueue.enqueue('Sam', 1);

priorityQueue.print();

至此,我们已经实现了优先队列,下面,将再介绍一种队列——循环队列

4.循环队列——击鼓传花

循环队列是默认队列的另一种修改版,什么是循环队列呢?举个现实中的例子,记得小时候玩过的传花游戏吗?

几个孩子围成一圈,开始击鼓了,孩子就把花尽快地传递给旁边的人,某一时刻鼓声停止了,传花也就停止了,这个时候花落在谁手上,谁就被淘汰。鼓声响起,继续传花,如此循环,直至只剩下一个孩子,即胜者。

function hotPotato(namelist, num) {

var queue = new Queue();

for (var i = 0; i < namelist.length; i++) { // {1}

queue.enqueue(namelist[i]);

}

var eliminated = "";

while (queue.size() > 1) { // {2}

for (var i = 0; i < num; i++) {

queue.enqueue(queue.dequeue()); // {3}

}

eliminated = queue.dequeue(); // {4}

console.log(eliminated + "在击鼓传花游戏中被淘汰");

}

return queue.dequeue(); // {5}

}

var names = ['john', 'jack', 'camila', 'ingrid', 'carl'];

var winner = hotPotato(names, 7);

console.log("胜利者: " + winner); //john

首先,先把名单添加到队列里面(行{1})。

当队列的的长度大于1的时候(行{2}),根据指定的一个数字(num)迭代队列,将队列的头一个移除并将其添加到队尾(行{3})。

一旦传递次数达到给定的数字,则删除此时的队列第一项(行{4}),即拿着花的那个人,他将被淘汰。

如此循环,直至队列的长度等于1,返回胜者(行{5})。

5.小结

通过这篇文章的介绍,我们学会了如何用数组构造出队列的类。同时,还掌握了很著名的优先队列、循环队列这两种结构。

附:

JavaScript数据结构和算法系列:

JS 栈

python循环队列_JS 队列-优先队列、循环队列相关推荐

  1. jsfor循环终止_js 终止 forEach 循环

    wp8 入门到精通 MultiMsgPrompt List arraymsg = new List(); List ArrayNotifyInfo ... 转:Top 10 Algorithms fo ...

  2. python环形队列_Python 实现数据结构-循环队列的操作方法

    今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...

  3. 【Java】 LeetCode 622. 设计循环队列 (有关实现循环队列的讲解)

    题目: 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列的一 ...

  4. 队列的定义、循环队列的顺序存储结构及链式存储结构

    文章目录 1 队列的定义 1.1 文字定义 1.2 代码定义 2 循环队列 2.1 循环队列的定义 2.2 循环队列的顺序存储结构 3 队列的链式存储结构 3.1 链队列的入队操作 3.2 链队列的出 ...

  5. 【数据结构】栈和队列OJ练习(栈和队列相互实现+循环队列实现)

    目录 前言 1.用队列实现栈 2.用栈实现队列 3.循环队列 前言 前面在学习了栈和队列的实现之后,相信大家对栈和队列的结构和使用方式都有了一些理解. 下面我们就来进行一些练习,这这章的练习相对于原来 ...

  6. php循环取redis队列,详解Redis和队列

    下面由Redis教程栏目给大家详解Redis和队列,希望对需要的朋友有所帮助! 概要 Redis不仅可作为缓存服务器,还可用作消息队列.它的列表类型天生支持用作消息队列.如下图所示: 由于Redis的 ...

  7. python多线程队列处理_Python线程和队列使用的一点思考

    Python线程和队列使用的一点思考 1. 斗哥采访环节请问为什么要使用线程? 答:为了提高程序速度,代码效率呀. 请问为什么要使用队列? 答:个人认为队列可以保证线程安全,实现线程间的同步,比较稳. ...

  8. Python网络编程 8 缓存与消息队列

    前面已经介绍了套接字API以及在Python中使用的基础IP网络操作来构建通信信道的方式.本章研究服务负载较重时常用的两项基本技术:缓存与消息队列.这两项技术有如下一些共同特点: 都是非常强大的工具, ...

  9. python判断队列是否为空_python队列Queue

    一.Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 队列在多线程中可以共享 ...

最新文章

  1. 谈谈服务雪崩、降级与熔断
  2. 什么是RSS订阅 Really Simple Syndication(聚合)
  3. python可以用来编写计算机网络程序吗_不必熟悉python或R编程语言,6步执行计算机视觉应用程序...
  4. 蓝桥杯之最大体积(数论+完全背包)
  5. 10个你可能没用过的linux命令
  6. java多线程构造函数_java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解...
  7. 图像检索:图像相似性度量
  8. PHP回顾之多进程编程
  9. php -- 魔术方法 之 自动加载:__autoload()
  10. 计算机如何建筑材料结合所学知识,《技术与设计2》第三、四单元检测试卷
  11. Linux下读写UART串口的代码
  12. 使用Android Studio生成APP图标
  13. mysql自学完整_MySQL自学篇(三)_MySQL
  14. 偏最小二乘回归(PLSR)算法原理
  15. python删除数组元素_如何删除numpy数组中的特定元素
  16. 【异常处理】The CXX compiler identification is unknown
  17. 福家宝机器人,关于举办第六届宁夏青少年智能机器人竞赛的通知.doc
  18. uniapp swiper组件被内容撑开
  19. 故宫景点功课5:中和殿和保和殿
  20. html表单设计姓名性别,编写一个表单页面census.html,让用户填写姓名、性别(男女选择)、兴趣(运动,读书,音乐,书法及其他)...

热门文章

  1. C#几行代码实现定时关机/重启 超详细(建议新手练习)
  2. vue3使用tinymce编辑器
  3. PHPStudy环境下phpmyadmin卡顿延迟不流畅解决办法
  4. QAxObject 读写 excel
  5. 大话数据结构二十二:图的存储结构之边集数组
  6. 基于Javaweb和阿里云服务器的用户管理平台
  7. Python基础入门之列表生成式
  8. TFB cas:223569-31-1,聚合物光电材料
  9. 机器学习项目三:XGBoost人体卡路里消耗预测
  10. Java面试题(九)-----编写程序实现判断E: / 根目录下是否有后缀名为.jpg的文件,如果有则输出文件名称