前面的两篇文章分别介绍了List和Stack,下面让我们一起来学习Queue

  • 数据结构之List | 让我们一块来学习数据结构
  • 数据结构之Stack | 让我们一块来学习数据结构

队列的概况

队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,先进先出,这点和栈不一样,在栈中,最后入栈的元素反而被优先处理。可以将队列想象成在银行前排队的人群,排在最前面的人第一个办理业务,新来的人只能在后面排队,直到轮到他们为止。

队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。队列被用在很多地方,比如提交操作系统执行的一系列进程、打印任务池等,一些仿真系统用队列来模拟银行或杂货店里排队的顾客。

基础队列

队列的两种主要操作是:向队列中插入新元素和删除队列中的元素。插入操作也叫做入队,删除操作也叫做出队。入队操作在队尾插入新元素,出队操作删除队头的元素。下图演示了这两个操作。


队列的另外一项重要操作是读取队头的元素。这个操作叫做 peek()。该操作返回队头元素,但不把它从队列中删除。除了读取队头元素,我们还想知道队列中存储了多少元素,可以使用 length 属性满足该需求;要想清空队列中的所有元素,可以使用 clear() 方法来实现。

使用数组来实现队列看起来顺理成章。JavaScript 中的数组具有其他编程语言中没有的优点,数组的 push() 方法可以在数组末尾加入元素,shift() 方法则可删除数组的第一个元素。

构建Queue类

class Queue {constructor() {this.dataStore = [];}enqueue(element) {this.dataStore.push(element);}dequeue() {return this.dataStore.shift();}front() {return this.dataStore[0];}back() {return this.dataStore[this.dataStore.length - 1];}empty() {return this.dataStore.length === 0;}toString() {return this.dataStore.toString();}length() {return this.dataStore.length;}
}

优先队列

在一般情况下,从队列中删除的元素,一定是率先入队的元素。但是也有一些使用队列的应用,在删除元素时不必遵守先进先出的约定。这种应用,需要使用一个叫做优先队列的数据结构来进行模拟。

从优先队列中删除元素时,需要考虑优先权的限制。比如医院急诊科的候诊室,就是一个采取优先队列的例子。当病人进入候诊室时,分诊护士会评估患者病情的严重程度,然后给一个优先级代码。高优先级的患者先于低优先级的患者就医,同样优先级的患者按照先来先服务的顺序就医。

先来定义存储队列元素的对象,然后再构建我们的优先队列系统:

class Patient {constructor(name, code) {this.name = name;this.code = code;}
}

变量 code 是一个整数,表示患者的优先级或病情严重程度(code越小代表病情越严重)。

下面需要重新定义Queue类的dequeue方法,使其删除队列中拥有最高优先级的元素。新的 dequeue()方法遍历队列的底层存储数组,从中找出优先码最低的元素,然后使用数组的 splice()方法删除优先级最高的元素。新的dequeue()方法定义如下所示:

dequeue() {let priority = this.dataStore[0];for (const i = 0, len = this.dataStore.length; i < len; i++){if (this.dataStore[i].code < priority) {priority = i;}}return this.dataStore.splice(priority, 1);
}

最后,需要定义 toString() 方法来显示 Patient 对象。

toString() {let retStr = "";for (var i = 0; i < this.dataStore.length; ++i) {retStr += `${this.dataStore[i].name} code: ${this.dataStore[i].code}\n`;}return retStr;
}

测试优先队列

双端队列

双端队列(deque,或称double-ended queue)是一种允许我们同时从前端和后端添加和移除元素的特殊队列。

在计算机科学中,双端队列的一个常见应用是存储一系列的撤销操作。每当用户在软件中进行了一个操作,该操作就会被存在双端队列中。当用户点击撤销按钮时,该操作会从双端队列中弹出,表示它被从后端移除了一个了。在进行了一定数量的操作后,最先进行的操作会被从双端队列的前端移除。由于双端队列同时遵循了先入先出和后入先出的原则,可以说是它是把队列和栈相结合的一种数据结构。

创建Deque类

class Deque {constructor() {this.dataStore = [];}addFront(element) {if(this.empty()){this.addBack(element)}else{this.dataStore.unshift(element);}}addBack(element) {this.dataStore.push(element);}removeFront() {return this.dataStore.shift();}removeBack() {return this.dataStore.pop();}front() {return this.dataStore[0];}back() {return this.dataStore[this.dataStore.length - 1];}empty() {return this.dataStore.length === 0;}toString() {return this.dataStore.toString();}length() {return this.dataStore.length;}
}

测试Deque类的代码

实际应用-->回文字符串的判断

回文是指这样一种现象:一个单词、短语或数字,从前往后写和从后往前写都是一样的。 比如,单词“dad”、“racecar”就是回文;如果忽略空格和标点符号,下面这个句子也是回 文,“A man, a plan, a canal: Panama”;数字 1001 也是回文。

在之前的文章中是使用栈(Stack)这一数据结构,其实回文字符串字号的判断方法是使用双端队列(Deque)来实现。

function isPalindrome(word) {if (typeof word !== "string") {throw TypeError(`参数不是string类型`);}let tmp = new Deque();for (let element of word) {tmp.addBack(element);}while (tmp.length() > 1) {if (tmp.removeFront() !== tmp.removeBack()) {return false;}}return true;
}console.log(isPalindrome("racecar")) // true
console.log(isPalindrome("hello")) // false

参考资料

  • 数据结构与算法JavaScript描述
  • 学习JavaScript数据结构与算法 第3版

数据结构之Queue | 让我们一块来学习数据结构相关推荐

  1. 数据结构稀疏矩阵的加法十字链表_学习数据结构和算法的框架思维

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

  2. 什么是数据结构?什么是算法?怎么学习数据结构与算法?

    01 前言 学习算法,我们不需要死记硬背那些冗长复杂的背景知识.底层原理.指令语法--需要做的是领悟算法思想.理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案.相比编程领域的其他技 ...

  3. python数据结构与算法第六讲_Python 学习 -- 数据结构与算法 (六)

    栈 是一种 "操作受限"的线性表,只允许在一端插入和删除数据. 从功能是上来说,数组和链表确实可以替代栈,但是特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口 ...

  4. 数据结构和算法学多久_重新学习数据结构和算法

    数据结构和算法学多久 为什么? 我记得在我第一次参加计算机科学算法课程时 伊丽莎白市州立大学(ECSU)认为:"我得到了什么 我自己变成了?!". 材料令人生畏,而且(大部分时间) ...

  5. c# 插入数据到 uniqueidentifier_每天5分钟用C#学习数据结构(16)二叉树 Part 2

    [基础知识]| 作者 / Edison Zhou这是恰童鞋骚年的第209篇原创文章 上一篇开始了树与二叉树之旅,本篇会介绍二叉树的基本实现.1二叉树的代码实现 二叉树节点的定义实现 /// /// 二 ...

  6. 学习数据结构有什么用?

    当我们遇到一个实际问题时,首先需要解决两件事: (1)如何将数据存储在计算机中: (2)用什么方法和策略解决问题. 前者是数据结构,后者是算法.只有数据结构没有算法,相当于只把数据存储到计算机中,而没 ...

  7. 两张思维导图,让你轻松学习数据结构

    ​前段时间打算重新温习一下数据结构,整理一些新的内容,在网上搜到了很多受用的精彩博客,可以说受益匪浅."前人栽树,后人乘凉"已然石锤了. 先亮出第一张思维导图: 数据结构思维导图- ...

  8. 数据结构与算法深入学习_我最喜欢的免费课程,用于深入学习数据结构和算法...

    数据结构与算法深入学习 by javinpaul 由javinpaul Data structures and algorithms are some of the most essential to ...

  9. 《Java程序设计与数据结构教程(第二版)》学习指导

    <Java程序设计与数据结构教程(第二版)>学习指导 目录 图书简况 学习指导 第一章 绪论 第二章 数据和表达式 第三章 使用类和对象 第四章 条件和循环 第五章 编写类 第六章 图形用 ...

最新文章

  1. python装饰器-Python 装饰器
  2. Mybatis-Helloword
  3. 寒武纪找到了引领中国AI芯片走向世界的路
  4. 2020有效的邮箱号大全_2020年公众号免费裂变涨粉的3个有效方法,让我一天涨粉6000...
  5. 06 使用VS2012开发简单控制器程序 1214
  6. 猜数游戏 (10 分)
  7. 在linux中写php语言吗,将PHP作为Shell脚本语言使用
  8. erlang四大behaviour之四-supervisor(转载)
  9. linux BufferedImage.createGraphics()卡住不动
  10. python的设计哲学_Python的设计哲学--zen of Python
  11. 算法第四版 练习答案 1.4.1
  12. 码神之路博客项目部署
  13. 「消息秒回」是一种美德
  14. 怎么看电脑网卡是否支持5g频段
  15. 计算机加密解除,bitlocker加密如何取消?Win7系统电脑取消bitlocker加密的方法
  16. CV项目肢体动作识别(三)内附完整代码和详细讲解
  17. go语言 json -转载
  18. 《UNIX网络编程》第一步:编写自己的daytime客户端,并从daytime服务器获取时间
  19. python实现图片识别汽车
  20. Unity游戏存档-PlayerPrefs类

热门文章

  1. 分享100个PHP源码,总有一款适合您
  2. [XXI Open Cup,Grand Prix of Tokyo]Ascending Matrix
  3. 麦克斯韦方程组_概述理解_电磁学
  4. hybris mysql_hybris使用mysql/sqlserver配置
  5. XQuery查询语言及应用实例分析
  6. 人参皂苷植物代谢物质靶向代谢检测
  7. 软件无线电zedboard+fmcomms2实现GPS信号模拟和接收
  8. Trapcode Particular 5 - Visibility
  9. linux如何创建计划任务,linux如何创建计划任务
  10. Unity3D之人物头顶名称与血条更新与绘制