热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[JavaScript]数据结构与算法——队列

JavaScript是当下最流行的编程语言之一,它可以做很多事情:而且目前大部分编程语言的高级应用都

前言

Javascript是当下最流行的编程语言之一,它可以做很多事情:

  • 数据可视化(D3.js,Three.js,Chart.js);
  • 移动端应用(React Native,Weex,AppCan,Flutter,Hybrid App,小程序);
  • 服务端(Express.js,Koa2);
  • 桌面应用(Electron,nw.js);
  • 游戏,VR,AR(LayaAir,Egret,Turbulenz,PlayCanvas);
  • 等等。。。

而且目前大部分编程语言的高级应用都会用到数据结构与算法以及设计模式。

本篇主要有三部分

  • 什么是队列
  • 队列的实现
  • 队列的变种

什么是队列

较官方解释

队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项。

队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾 。

[ Javascript ] 数据结构与算法 —— 队列

注:出队入队是自己加的,不知道是不是这么叫

个人理解

我看有很多文档都是说队列就像买什么东西排队,我认为这个比喻用在标准队列上不恰当。

我觉得标准队列像是一段管道,每次都只能放一个球进去,上边只用来放球(入队),由于地球引力,球会从下边的口出去(出队)。

[ Javascript ] 数据结构与算法 —— 队列

队列:这段可以放球的管道就是队列

元素:管道里的球

队首:在当前管道里的球最早放进去的那个球的位置,同时也是第一个掉出去的球

队尾:在当前管道里的球最后放进去的那个球的位置,同时也是最后一个掉出去的球

队列的实现

  • 添加队列成员
  • 删除队列成员
  • 返回队首的成员
  • 队列是否为空
  • 清空队列
  • 队列长度
  • 返回字符串形式的队列成员
class Queue {
    constructor() {
        this.count = 0; // 整个队列下一成员的位置
        this.lowestCount = 0; // 在第一位的成员位置
        this.items = {}; // 用来存放的队列
    }

    enqueue(element) { 
        // 添加队列成员 进入队列
    }

    dequeue() { 
        // 删除队列成员 离开队列
    }

    peek() { 
        // 返回队首的成员
    }

    isEmpty() { 
        // 判断队列是否为空
    }

    clear() { 
        // 将所有的数据初始化
    }

    size() { 
        // 队列长度 
    }

    toString() {
        // 返回字符串形式的队列成员
    }
}

添加队列成员

enqueue(element) {
    this.items[this.count] = element; // 将元素放入队列
    this.count++; // 将计数器加一
}

删除队列成员

dequeue() {
    if (this.isEmpty()) { // 如果是空 
        return undefined; // 返回未定义 undefined
    }
    const result = this.items[this.lowestCount]; // 将队首的成员保存下
    delete this.items[this.lowestCount]; // 将队首的成员删除掉 删除对象属性
    this.lowestCount++; // 将队列提前一位 指向队首的指针后移一位
    return result; // 返回被删除的成员
}

返回队首的成员

peek() {
    if (this.isEmpty()) { // 非空才能继续处理
        return undefined;
    }
    return this.items[this.lowestCount];
}

队列是否为空

isEmpty() { // 判断长度是不是 0 
    return this.size() === 0;
}

清空队列

clear() {
    this.count = 0; // 恢复初始值 
    this.lowestCount = 0;  // 恢复初始值
    this.items = {};  // 重新赋值空对象
}

队列长度

size() { // 队列长度 等于 整个队列下一成员的位置 减去 在第一位的成员位置
    return this.count - this.lowestCount;
}

返回字符串形式的队列成员

toString() {
    if (this.isEmpty()) {
        return '';
    }
    let objString = `${this.items[this.lowestCount]}`;
    for (let i = this.lowestCount + 1; i  
 

队列的变种

  • 优先队列

类似去医院看病,急诊,会优先一般的门诊

  • 循环队列

类似抢凳子游戏,队列首位相连

优先队列

在添加成员时会判断优先级,

class QueueElement (element, priority){ // 队列成员类
    this.element = element; // 存放成员
    this.priority = priority;  // 存放优先级 
} 

enqueue(element, priority){ 
    let queueElement = new QueueElement(element, priority);  // 添加成员
    let added = false;  // 是否已添加到队列
    for (let i = 0; i  i; j--){
                items[j] = items[j-1];
            }
            items[i] = queueElement;
        // splice end
            added = true;  // 标识符置为真,表示已经添加
            break; // 跳出循环
        } 
    } 
    if (!added){  // 如果没有找到优先级比新添加的成员低的,那么将其添加到队尾
        items.push(queueElement);
    } 
};

循环队列

在操作时每删除一个队列成员就将删除的这个队列成员重新添加到队列中

for (let i = 0; i  

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • 近来有一个需求,是需要在androidjava基础库中插入一些log信息,完成这个工作需要的前置条件有编译好的android源码具体android源码如何编译,这 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了SPOJ2829题目的解法及优化方法。题目要求找出满足一定条件的数列,并对结果取模。文章详细解释了解题思路和算法实现,并提出了使用FMT优化的方法。最后,对于第三个限制条件,作者给出了处理方法。文章最后给出了代码实现。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
author-avatar
吕小布
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有