JavaScript数据结构和算法----队列
前言
队列和栈很像,只是用了不同的原则。队列是遵循先进先出(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数据结构和算法----队列的更多相关文章
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- JavaScript数据结构与算法-队列练习
队列的实现 // 队列类 function Deque () { this.dataStore = []; this.enqueueFront = enqueueFront; this.enqueue ...
- Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法
前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...
- 为什么我要放弃javaScript数据结构与算法(第四章)—— 队列
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第四章 队列 队列数据结构 队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序 ...
- 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列
定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- JavaScript数据结构——栈和队列
栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...
- 前端开发周报: CSS 布局方式方式与JavaScript数据结构和算法
前端开发周报:CSS 布局方式与JavaScript动画库 1.常见 CSS 布局方式详见: 一些常见的 CSS 布局方式梳理,涉及 Flex 布局.Grid 布局.圣杯布局.双飞翼布局等.http: ...
- 为什么我要放弃javaScript数据结构与算法(第九章)—— 图
本章中,将学习另外一种非线性数据结构--图.这是学习的最后一种数据结构,后面将学习排序和搜索算法. 第九章 图 图的相关术语 图是网络结构的抽象模型.图是一组由边连接的节点(或顶点).学习图是重要的, ...
随机推荐
- 使用 vi 命令
一.vi是什么 vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器. Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实 ...
- windows计划任务
前段时间写了一个小工具,实现两个数据库的数据同步. 需求:要求每天的某个时间自动同步数据 功能写好之后,发现了windows一个自带的功能不错,可以实现我的需要,不用写定时器触发了 控制面板-> ...
- EasyUI datagrid动态生成列
任务描述:根据用户选择时间段,生成列数据,如图
- Kafka Cached zkVersion [62] not equal to that in zookeeper, skip updating ISR (kafka.cluster.Partition) 问题分析
我司业务Kafka集群是3节点(broker分别为10,20,30),每个Topic 3 Partition,3 Repilication的配置,早上起床突然发现所有Topic的Broker节点都变为 ...
- html标记语言 --文本标记
html标记语言 --文本标记 二.文本标记 1.h1-h6 标题标记,h1最大 2.font 字体设置标记 2.1 size字体大小.<font size="> 取值范围1-7 ...
- MySQL中的字符串函数
使用字符串数据 当使用字符串数据时,可以使用下面的字符数据类型. CHAR 固定长度.不足部分使用空格填充的字符串. varchar 变长字符串. text(MySQL和SQL Server)或CLO ...
- es6第一章 continue
块级作用域 ES6内允许块级作用域任意嵌套 {{{{let insane = 'Hello World'}}}} 这段代码使用了一个五层的作用域. {{{{ {let c = ''hello worl ...
- java中的数组概念
数组的定义形式: 动态初始化方式: 1.声明并开辟数组 String str[]=new String[3];//3表示数组的长度 2.分布完成 String str[]=null; str=new ...
- Django REST framework+Vue 打造生鲜超市(十一)
十二.支付宝沙箱环境配置 12.1.创建应用 进入蚂蚁金服开放平台(https://open.alipay.com/platform/home.htm),登录后进入管理中心-->>应用列表 ...
- 机器学习技法:03 Kernel Support Vector Machine
Roadmap Kernel Trick Polynomial Kernel Gaussian Kernel Comparison of Kernels Summary