队列是一种遵从先进先出(FIFO)原则的有序集合

队列在尾部添加新元素,从顶部移除元素

队列的理解

队列在我们生活中最常见的场景就是排队了

队列这个名字也已经很通俗易懂了

和栈很像,这不过队列是先入先出的数据结构

队列的前面是队头

队列的后面是队尾

出队从队头出

入队从队尾入

队列的创建

和栈类似,这里我就不就不啰嗦了

同样需要实现一些功能

这里我类比生活中的排队上厕所

向队列中添加元素(进入排队的队伍中)

移除队头元素(队伍最前面的人出队进入厕所)

查看队头元素(查看队伍最前面的人)

判断队列是否为空(看看队伍中有没有人)

移除队伍全部元素(厕所炸了,都散了吧)

查看栈里元素个数(查看排队的有多少人)

于是我们可以创建一个完整队列实现,同样是利用我们的数组实现

数组头就是队列头

function Queue() {

var items = [];

this.enqueue = function (ele) {

items.push(ele);

};//入队

this.dequeue = function () {

return items.shift();

};//出队

this.front = function () {

return items[0];

};//查看队头元素

this.isEmpty = function () {

return items.length === 0;

};//判断队列是否为空

this.size = function () {

return items.length;

};//队列大小

this.clear = function () {

items = [];

};//清空队列

this.print = function () {

console.log(items.toString());

};//打印队列

}

var queue = new Queue(); //声明队列的实例

队列的使用

下面我们就用这个队列简单模拟排队

var queue = new Queue();

console.log("队列是否为空: " + queue.isEmpty());

queue.enqueue('Mr.A');

queue.enqueue('Mr.B');

queue.enqueue('Mr.C');

console.log("当前队列:");

queue.print();

console.log("出队的人: " + queue.dequeue());

console.log("当前队列:");

queue.print();

控制台打印:

优先队列

在我们排队上厕所的时候,来了一位拥有VIP会员卡的朋友,插到了队伍的最前面

过了一会儿又来了一位拥有SVIP会员卡的朋友,插到了VIP的前面

虽然这个比喻可能不恰当,但是生活中可能存在有优先级的队列

优先级高的人可以查到优先级低的人前面

这就是循环队列

如果优先值小的元素放到队列的前面,这叫做最小优先队列反之优先值大的元素放到队列的前面,这叫做最大优先队列但其实他们两个仅仅是一个判断的改变,实现方式是一样的

优先队列较普通队列的区别也就是入队要判断优先级,并且需要对我们的元素进行处理,其他方法不变

这处理也就是把元素包装为一个拥有优先级的对象

既然所有对象都有着同样的属性,那我们毫无疑问就应该使用工厂构建

我们可以稍微修改一下我们的队列类

来实现一个最小优先队列

function PriorityQueue() {

var items = [];

function QueEle(ele, priority){ //封装我们的元素为一个对象

this.ele = ele; //元素

this.priority = priority; //优先级

}

this.enqueue = function (ele, priority) {

var queObj = new QueEle(ele, priority); //创建队列元素对象

if(this.isEmpty()){ //如果队列是空的,直接插入

this.push(queObj);

}else{

var bAdded = false;

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

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

items.splice(i, 0, queObj); // 循环队列,如果优先级小于这个位置元素的优先级,插入

bAdded = true;

break;

}

}

if(!bAdded){

items.push(queObj); // 如果循环一圈都没有找到能插队的位置,直接插入队列尾部

}

}

};

this.dequeue = function () {

return items.shift();

};

this.front = function () {

return items[0];

};

this.isEmpty = function () {

return items.length === 0;

};

this.size = function () {

return items.length;

};

this.clear = function () {

items = [];

};

this.print = function () {

//这个地方稍微修改一下下

var temp = [];

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

temp.push(items[i].ele);

}

console.log(temp.toString());

};

}

解释我已经在代码里说的很明白

下面我们就用这个优先队列同样来模拟排队上WC

var pQueue = new PriorityQueue();

pQueue.enqueue('Mr.A', 3);

pQueue.enqueue('Mr.B', 3);

pQueue.enqueue('Mr.C', 3);

console.log("原队列:");

pQueue.print();

pQueue.enqueue('VIP', 2);

pQueue.enqueue('SVIP', 1);

console.log("新队列:");

pQueue.print();

控制台打印:

循环队列

循环队列典型的例子击鼓传花

还记得在我上高中的时候我们晚自习一停电就玩这个

拿一个东西当“花”,轮着传,“鼓”一停,拿到花的同学就要站起来唱歌

可以把循环队列当作是队列的应用

下面我们来模拟实现循环队列击鼓传花

function hotPotato(pepoleList, frequency){ //参数:表示人的数组,传花的频率

var queue = new Queue();

for(var i = 0, len = pepoleList.length; i < len; i++){

queue.enqueue(pepoleList[i]); //初始化,进入队列

}

var eliminated;//被淘汰的同学

while(queue.size() > 1){ //只要队列至少还有两个人,就一直循环

for(var i = 0; i < frequency; i++){//出队入队,模拟循环效果

queue.enqueue(queue.dequeue());

}

eliminated = queue.dequeue();//清算

console.log(eliminated + '被淘汰');

}

return queue.dequeue();//返回队列中的最后一人

}

var pepole = ['Mr.A','Mr.B','Mr.C','Mr.D','Mr.E','Mr.F'];

var gameWinner = hotPotato(pepole, 12);

console.log('全场最佳:' + gameWinner);

控制台输出:

以上就是JavaScript下的队列实现。

我们还简单理解了两个特殊的队列:优先队列与循环队列。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java先进先出 循环队列,JavaScript队列、优先队列与循环队列相关推荐

  1. html插入循环图片,javascript – HTML5在带有for循环的画布上绘制图片?

    所以,我想用 HTML5创建一个Minecraft网站主题.我在HTML5 / Javascript中有点摇摇欲坠(暂时没用过它),我需要一些帮助.我正在尝试计算一些可以放在屏幕上的16x16px瓷砖 ...

  2. python循环队列_JS 队列-优先队列、循环队列

    <学习JavaScript数据结构与算法>读书笔记. 队列是遵行FIFO(First In First Out, 先进先出)原则的一组有序的项.队列再尾部添加新元素,并从顶部移除元素. 在 ...

  3. java 先进先出 列子,Java队列

    队列是只能在其上执行操作的对象的集合两端的队列. 队列有两个末端,称为头和尾. 在简单队列中,对象被添加到尾部并从头部删除并首先删除首先添加的对象. Java Collections Framewor ...

  4. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  5. JavaScript 数据结构与算法(队列)

    队列数据结构 队列是遵循先进先出(FIFO,也称为先来先服务)原则的一组有序的项.队列在尾部添加新元素,并从顶部移除元素.最新添加的元素必须排在队列的末尾.在现实中,最常见的队列的例子就是排队. 创建 ...

  6. Java 集合深入理解(9):Queue 队列

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情不太好,来学一下 List 吧! 什么是队列 队列是数据结构中比较重要的一种类型,它支持 FIFO,尾部添加.头部 ...

  7. Java多线程基础-9:代码案例之阻塞队列

    阻塞队列是一种特殊的队列,带有"阻塞特性",也遵守队列 "先进先出" 的原则.阻塞队列是一种线程安全的数据结构,并且具有以下特性: 当队列满时,继续入队列就会阻 ...

  8. 循环队列c语言的实现,循环队列的C语言实现

    生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构 ...

  9. 如何在JavaScript中实现堆栈和队列?

    本文翻译自:How do you implement a Stack and a Queue in JavaScript? What is the best way to implement a St ...

最新文章

  1. java安全例外_java – 本地Applet安全例外
  2. Linux没有安装gcc如何在线安装(直接在Linux终端安装)
  3. 树莓派python串口中文输出_Python实现树莓派USB串口通讯
  4. sql视图 权限_MySQL数据库的SQL语言与视图
  5. android 设置folder类型,正确配置你的 Android 项目
  6. Knn原理及Python实现、数据展示
  7. javascript动画系列第二篇——磁性吸附
  8. GDAL不支持创建PCIDSK的面状矢量格式
  9. swift 运算符快速学习(建议懂OC或者C语言的伙伴学习参考)
  10. 将中文姓名转为拼音英文名的一种实现
  11. Keil编译后——代码长度超过版本限制
  12. (附源码)springboot垃圾自动分类管理系统 毕业设计 160846
  13. Git报错The requested URL returned error: 403
  14. Android 11.0 12.0修改搜狗为默认输入法,并且授予运行权限
  15. Go语言国际电子表格文档格式标准实践
  16. 浅析正向代理、反向代理、透明代理
  17. PBOC/EMV之文件结构
  18. 危险化学品事故爬虫解析
  19. 中国消费级无人机行业发展态势及前景战略规划建议报告2021-2027年
  20. K8S - 安装教程 和 体验(kubeadm)

热门文章

  1. CLR运行时细节 - Method Descriptor
  2. [公测]微信小程序设计指南文档
  3. TagHelper是怎么实现的
  4. ENode 2.8 最新架构图简介
  5. sybase 连接mysql_如何连接到Sybase SQL Anywhere数据库
  6. 西北师范大学地理与环境科学学院考研真题汇总(自然地理学)持续更新。。。
  7. 【遥感数字图像处理】实验:遥感图像分析方法大全(Erdas版)
  8. linux c之c语言符合标准的头文件和linux常用头文件
  9. Android之Animation动画的介绍及用法
  10. 关于nginx为站点绑定域名以及绑定多个域名