前言

  队列和栈很像,只是用了不同的原则。队列是遵循先进先出(FIFO)原则的一组有序的的项,队列在尾部添加新元素,从顶部移除元素。最新添加的元素必须必须排队在队列的,末尾。可以想象食堂排队买饭的样子。

一、创建队列

  1、创建一种数据结构来保存队列里面的数据,这里选择数组
  2、声明一些栈的方法
  enqueue(element(s)) : 添加一个或一些元素到队列的末尾
  dequeue() : 移除队列第一个的元素(就是排队在最前面的),同时返回被移除的元素。
  front() : 返回队列第一个的元素(最先被添加的),仅仅是返回,不做任何修改。
  isEmpty() : 如果队列里面没有任何元素就返回true,否者为false。
  clear() : 清除队列里面的元素。
  size() : 返回队列里面的个数。

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());
}
} var queue = new Queue();
console.log(queue.isEmpty());
queue.enqueue('leaf');
queue.enqueue('jack')
console.log(queue.size());
console.log(queue.dequeue());
console.log(queue.isEmpty());
console.log(queue.size());

  

二、循环队列 --击鼓传花游戏

var nameList = ['leaf', 'jack', 'jef', 'rose', 'red', 'mandy', 'hardy', 'mark' ];
function cyclicGame(nameList){ var queue = new Queue(),
len = nameList.length; for(var i=0 ; i<len; i++){
queue.enqueue(nameList[i]);
} var weedOutName = '';
while(queue.size()>1){
for(var i=0; i<Math.floor(Math.random()*len); i++){
queue.enqueue(queue.dequeue());//把第一个删除了添加后面
}
weedOutName = queue.dequeue();
console.log(weedOutName + '第'+ (len-queue.size()) +'轮被淘汰了!');
} return console.log(queue.dequeue() + '是最后的胜利者!');//最后一个元素,胜利者 } cyclicGame(nameList);

  

三、事件队列管理

  JS的执行环境是单线程的,一次只能完成一个任务,其任务的调度方式就是排队,这就在医院挂号一样,前面的那个人没有搞定,你就只能站在后面排队等着。在事件队列中加一个延时,这样的问题便可以得到缓解,下面用代码模拟这个情景。

var Queue = {
//保存队列信息
items : [],
//添加到队列
enqueue : function(executeQueue){
//添加到队列,如果不是函数或者数字的不处理
if(!/function|number/.test(typeof executeQueue)){
return;
} Queue.items.push(executeQueue);
//返回自身的引用
return Queue;
},
//执行队列
executeQueue : function(){
//删除队列第一个元素并返回它
var dequeue = Queue.items.shift(); //如果队列为空的,直接返回
if(!dequeue){
return;
} //如果是函数,直接执行,然后继续执行executeQueue
if(typeof dequeue === "function"){
dequeue();
Queue.executeQueue();
return;
} //如果是数字,该数字作为延迟的时间, 延迟executeQueue
setTimeout(function(){
Queue.executeQueue();
//console.log(dequeue);
}, dequeue);
}
}; //测试
Queue
//添加事件
.enqueue(function(){
console.log('3秒之后执行第1个');
})
.enqueue(3000)
.enqueue(function(){
console.log('3秒之后执行第2个');
})
.enqueue(3000)
.enqueue(function(){
console.log('3秒之后执行第3个');
})
//执行事件
.executeQueue();

  

四、看一个栗子--实现layMan的功能

实现:

lazyMan('leaf').eat('苹果').sleep(2).eat('雪梨').sleep(3).eat('香蕉')

采用事件队列的思想,根据队列的先后循序执行;

function LazyMan(name) {
if(this.constructor !== LazyMan) {
return new LazyMan(name)
}
//保存队列
this.tasks = [];
var self = this;
var fn =(function(n){
var name = n;
return function(){
console.log("Hi! This is " + name + "!");
self.next();
}
})(name);
this.tasks.push(fn); //执行队列里面第一个事件
setTimeout(function(){
self.next();
}, 0);
} /* 事件调度函数 */
LazyMan.prototype.next = function() {
var fn = this.tasks.shift();
fn && fn();
} LazyMan.prototype.eat = function(name) {
var self = this;
var fn =(function(name){
return function(){
console.log("Eat " + name + "~");
self.next()
}
})(name);
this.tasks.push(fn);
return this; // 实现链式调用
}
LazyMan.prototype.sleep = function(time) {
var self = this;
var fn = (function(time){
return function() {
setTimeout(function(){
console.log("Wake up after " + time + "s!");
self.next();
}, time * 1000);
}
})(time);
this.tasks.push(fn);
return this;
}
LazyMan.prototype.sleepFirst = function(time) {
var self = this;
var fn = (function(time) {
return function() {
setTimeout(function() {
console.log("Wake up after " + time + "s!");
self.next();
}, time * 1000);
}
})(time);
this.tasks.unshift(fn);
return this;
}
/* 封装 */
function lazyMan(name){
return new LazyMan(name);
} //调用
lazyMan('leaf').eat('苹果').sleep(2).eat('雪梨').sleep(3).eat('香蕉')

  

  

JavaScript数据结构和算法----队列的更多相关文章

  1. javascript数据结构与算法---队列

    javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...

  2. JavaScript数据结构与算法-队列练习

    队列的实现 // 队列类 function Deque () { this.dataStore = []; this.enqueueFront = enqueueFront; this.enqueue ...

  3. Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法

    前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...

  4. 为什么我要放弃javaScript数据结构与算法(第四章)—— 队列

    有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第四章 队列 队列数据结构 队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序 ...

  5. 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列

    定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...

  6. JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)

    前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...

  7. JavaScript数据结构——栈和队列

    栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...

  8. 前端开发周报: CSS 布局方式方式与JavaScript数据结构和算法

    前端开发周报:CSS 布局方式与JavaScript动画库 1.常见 CSS 布局方式详见: 一些常见的 CSS 布局方式梳理,涉及 Flex 布局.Grid 布局.圣杯布局.双飞翼布局等.http: ...

  9. 为什么我要放弃javaScript数据结构与算法(第九章)—— 图

    本章中,将学习另外一种非线性数据结构--图.这是学习的最后一种数据结构,后面将学习排序和搜索算法. 第九章 图 图的相关术语 图是网络结构的抽象模型.图是一组由边连接的节点(或顶点).学习图是重要的, ...

随机推荐

  1. kubernetes进阶(05)kubernetes的命令

    在Kubernetes中,Node.Pod.Replication Controller.Service等概念都可以看作一种资源对象,通过Kubernetes提供的Kubectl工具或者API调用进行 ...

  2. Linux知识积累(8)卸载安装jdk

    java -version yum remove java yum groupremove java java -version tar -zxvf jdk-8u60-linux-x64.tar.gz ...

  3. Docker学习笔记 - Docker容器与外部网络的连接

    学习目的: ip_forward 包过滤防护墙 iptables 允许端口映射访问 限制ip访问容器 1.ip_forward 控制系统是否会转发流量 检查linux系统转发是否开启命令:sysctl ...

  4. Linux磁盘分区-rpm-yum

    一.磁盘分区 1.开启Linux系统前添加一块大小为15G的SCSI硬盘 2.开启系统,右击桌面,打开终端 3.为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...

  5. 不错的ngix/redis/java/android学习地址

    http://blog.csdn.net/xlgen157387/article/details/50051543 徐刘根的博客,好像是“Java后端技术”微信公众号的建立者,反正看到不少关于他的博文 ...

  6. transform做2d和3d变形(css动画一)

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 有段时间我是没理清transform.translate.transition和animation之间的关 ...

  7. Spting +Spring MVC+spring date jsp +hibernate+jq

    controller 控制页面跳转 处理前台后台数据交互 访问servicedao层:@Repository 数据库访问层 增删改查 jpa规范了hibernate jap仓库 jpa自动解析 方法名 ...

  8. 同主机下Docker+nginx+tomcat负载均衡集群搭建

    想用Docker模拟一下nginx+tomcat集群部署,今天折腾了一天,遇坑无数,终于在午夜即将到来之际将整个流程走通,借本文希望给同样遇到类似问题的小伙伴们留点线索. 主机环境是CentOS 7, ...

  9. WebGL文字渲染的那些问题

    THREE.js开发的应用运行在iphone5下发现有些时候会崩溃,跟了几天发现是因为Sprite太多频繁更新纹理占用显存导致的.通常解决纹理频繁更新问题就要用到one draw all方法,放到纹理 ...

  10. 【PYTHON】三级菜单

    # Author: Stephen Yuan area_range = { '广东省': { '广州市': { '海珠区': ['全区总面积90.40平方公里', '2015年,海珠区生产总值达到14 ...