1. 前言

队列,是一种遵从先进先出(FIFO,First-In-First-Out)原则的有序集合。队列在尾部添加新元素,并从顶部移除元素,最新添加的元素必须排在队列的末尾。

2.功能说明

  1. enqueue(value):进队,添加一个新元素到队列末尾
  2. dequeue():出队,移除队列中的第一个元素,同时返回该元素
  3. front():获取队列中的第一个元素
  4. isEmpty():判断队列是否为空。是返回true,否返回fallse
  5. clear():清空队列里的元素
  6. size():获取队列里元素的个数

3. 代码实现

首先,先创建一个类表示队列,并且初始化一个空数组,用来保存队列里的元素

class Queue {
constructor() {
this.items = [];
};
}

接着,在这个队列类中实现所需要的功能:

class Queue {
constructor() {
this.items = [];
} //进队,从队的尾部进入
enqueue(value) {
this.items.push(value);
} //出队,从队的头部出
dequeue() {
return this.items.shift();
} //获取队中的第一个元素
front() {
return this.items[0];
} //判断队是否为空
isEmpty() {
return this.items.length === 0;
} //获取队中元素的个数
size() {
return this.items.length;
}
}

4. 测试

在这里,我们可以利用队列模拟‘击鼓传花’的游戏:

/*
*名称:击鼓传花
*参数:nameArr,为一个数组,包含了参与该游戏的所有人员名字;
* num,击鼓的次数
*返回:最终游戏胜利者的名字
*/
function JGCH(nameArr, num) {
var queue = new Queue(); //实例化一个队列
for (var i = 0; i < nameArr.length; i++) {
queue.enqueue(nameArr[i]); //将传入的数组中的人员名字加入到队列中
}
var taotai = '';
while (queue.size() > 1) {
for (var i = 0; i < num; i++) {
//每击一次鼓,将队列开头的一项移至队尾
queue.enqueue(queue.dequeue());
}
//击鼓停止,拿着花的那个人即被淘汰,移出队列
taotai = queue.dequeue();
console.log(taotai + '被淘汰!!!');
}
//最后队列里剩下的那个人即为最终胜利者
return queue.dequeue();
}
var nameArr = ['郭靖', '张无忌', '乔峰', '虚竹', '段誉'];
console.log('最终胜利者是:' + JGCH(nameArr, 10));

游戏结果:

5.完整代码

完整代码请戳☞☞☞Queue.js

(完)

原生JS实现队结构及利用队列模拟‘击鼓传花’游戏的更多相关文章

  1. 原生JS实现集合结构

    1. 前言 集合是由一组无序且唯一(即不能重复)的项组成的.你可以把集合想象成一个既没有重复元素,也没有顺序概念的数组.在ES6中已经内置了集合这一数据结构--Set.接下来,我们就用原生JS来实现这 ...

  2. 原生JS实现栈结构

    1. 前言 栈,是一种遵从后进先出(LIFO,Later-In-First-Out)原则的有序集合.新添加的元素都保存在栈的一端,称作栈顶,另一端叫做栈底.在栈中,新元素都靠近栈顶,旧元素都靠近栈底. ...

  3. 玩转图片上传————原生js XMLHttpRequest 结合FormData对象实现的图片上传

    var form=document.getElementById("formId"); var formData=new FormData(form); var oReq = ne ...

  4. (js描述的)数据结构[队列结构,优先级队列](3)

    (js描述的)数据结构[队列结构](3) 一.队列结构的特点: 1.基于数组来实现,的一种受限的线性结构. 2.只允许在表头进行删除操作,在表尾进行插入操作. 3.先进先出(FIFO) 二.队列的一些 ...

  5. 移动端lCalendar纯原生js日期时间选择器

    网上找过很多的移动端基于zepto或jquery的日期选择器,在实际产品中也用过一两种,觉得都不太尽如人意,后来果断选择了H5自己的日期input表单,觉得还可以,至少不用引用第三方插件了,性能也不错 ...

  6. .NET中的FileUpload控件的使用-原生JS(二)

    本篇使用原生JS进行数据传输,使用FileUpload控件上传文件,适配IE. HTML <div class="container"> <div class=& ...

  7. 利用tween,使用原生js实现模块回弹动画效果

    最近有一个需求,就是当屏幕往下一定像素时,下方会有一个隐藏的模块马上显现出来,向上运动后带有回弹效果.然后屏幕滚回去时这个模块能够原路返回 其实这个效果css3就可以很轻松实现,但是公司要求最低兼容i ...

  8. 利用原生js制做数据管理平台,适合初学者学习

    摘要:数据管理平台在当今社会中运用十分广泛,我们在应用过程中,要对数据进行存储,管理,以及删除查询等操作,而我们在实际设计的时候,大牛们大多用到的是JQuery,而小白对jq理解也较困难,为了让大家回 ...

  9. 利用原生js做数据管理平台

    摘要:数据管理平台在当今社会中运用十分广泛,我们在应用过程中,要对数据进行存储,管理,以及删除查询等操作,而我们在实际设计的时候,大牛们大多用到的是JQuery,而小白对jq理解也较困难,为了让大家回 ...

随机推荐

  1. 原生js动态创建、获取、删除属性的几种方式

    1.创建属性 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  2. Java类和对象动手动脑

    动手动脑1 以下代码为何无法通过编译?哪儿出错了?

  3. Bitset改进你的程序质量

    1:Bitset介绍 BitSet 是用于存储二进制位和对二进制进行操作的 Java 数据结构, 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的整数将 B ...

  4. HTML 元素居中的方法

    网址:http://www.cnblogs.com/asqq/archive/2012/04/09/2438745.html 1. 元素的定位的方法选择 :absolute . 2. 给定元素的宽和高 ...

  5. Docker安装ELK并实现JSON格式日志分析

    ELK是什么 ELK是elastic公司提供的一套完整的日志收集以及前端展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch.Logstash和Kibana. 其中Logstash ...

  6. mycat+mysql搭建高可用集群1--垂直分库

    mycat垂直分库 本文主要介绍了如何使用mycat对mysql数据库进行垂直分库,包括: 垂直分库的步骤 垂直分库的环境准备 配置mycat垂直分库 1. 垂直分库的步骤 收集分析业务模块间的关系 ...

  7. libevent::事件

    /***************************************************************** 函数功能: 创建事件集 ********************* ...

  8. 概念理解-IO多路复用

    epoll 是 Linux 内核为处理大批量文件描述符而作了改进的 poll,是 Linux 下多路复用 IO接口 select/poll 的增强版本 在 linux 的网络编程中,很长时间都在使用 ...

  9. SpringCloud之RefreshScope 源码解读

    SpringCloud之RefreshScope @Scope 源码解读 Scope(org.springframework.beans.factory.config.Scope)是Spring 2. ...

  10. 【RabbitMQ 实战指南】一 过期时间TTL

    RabbitMQ 可以对消息和队列设置过期时间(TTL) 1.设置消息的TTL 目前有两种方式可以设置消息的TTL 第一种方式是通过队列属性设置,队列中所有消息都有相同的过期时间 第二种方式是对消息本 ...