前言

  队列和栈很像,只是用了不同的原则。队列是遵循先进先出(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. HTTP协议的消息头:Content-Type和Accept的作用

    一.背景知识 1.概述 Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报头结构:通用报头|响应报头|实体报头 Acc ...

  2. ActiveMQ学习系列(三)----下载github源码并编译

    前记:坚持使用官网的资源去学习是挺痛苦的一个过程,昨天瞎溜达了一天,也没看到有系统性的学习文章,倒是发现了github上的ActiveMq项目. 地址:https://github.com/apach ...

  3. 分享java常用技术教程:dubbo、zookeeper、ActiveMq、多线程、Redis、PowerDesigner等

    游戏是自己整理的邮箱来源于网上,下面是我的有道云的分享地址: https://note.youdao.com/share/?id=c5f258fa9efd1b28b2d8f0d37e59b194&am ...

  4. 高级控件 popwindow 与gridview的组合应用

    Gridview 的布局设置 <GridView android:layout_width="wrap_content" android:layout_height=&quo ...

  5. priority queue优先队列初次使用

    题目,排队打印问题 Input Format One line with a positive integer: the number of test cases (at most 20). Then ...

  6. Hibernate(十):n-n关联关系

    背景: 在实际开发中我们会遇到表的多对多关联,比如:一篇博客文章,它可以同时属于JAVA分类.Hibernate分类. 因此,我们在hibernate的学习文章系列中,需要学会如何使用hibernat ...

  7. hdu1022 Train Problem I---模拟栈

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 题目大意: 车的进出站问题,先给出N个火车,再按序列一的方式进站,判断能否以序列二的方式出站,若 ...

  8. 控件篇:CheckedListBox的全选与反选

    private void cbXmlAll_CheckedChanged(object sender, EventArgs e) { for (int i = 0; i < cblXmlList ...

  9. Python面向对象——基本继承

    1.基本继承图解 1.1实例化一个Contact类的对象c 1.2实例化一个Supplier类的对象s 1.3访问对象的属性 1.4访问对象s的方法 1.5类变量详解 如果从新定义c.all_cont ...

  10. MySQL中的数值函数

    加减乘除(+.-.*./)均可用于数值计算. SELECT (1 + 1) / (1 * 2.2 - 3) 执行算术函数 单参数数值函数举例: acos(x), asin(x), atan(x), c ...