用js来实现那些数据结构06(队列)
其实队列跟栈有很多相似的地方,包括其中的一些方法和使用方式,只是队列使用了与栈完全不同的原则,栈是后进先出原则,而队列是先进先出(First In First Out)。
一、队列
//声明Queue类
function Queue() {
//声明并初始化一个用来存放队列元素的数组。
let 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.size = function () {
return items.length;
};
//打印该队列
this.print = function () {
console.log(items.toString())
};
}
const queue = new Queue();
console.log(queue.isEmpty()); // outputs true
queue.enqueue('John');
queue.enqueue('Jack');
queue.print(); // John,Jack
queue.enqueue('Camila');
queue.print(); // John,Jack,Camila
console.log(queue.size()); // outputs 3
console.log(queue.isEmpty()); // outputs false
queue.dequeue(); // remove John
queue.dequeue(); // remove Jack
queue.print(); // Camila
上面我们就已经实现了队列这种数据结构,同样的,我们是否可以稍微改造一下,让队列的实现看起来更加优美一点。
let Queue = (function () {
const items = new WeakMap();
class Queue {
constructor () {
//强调一下,这里items是WeakMap类型的数据,而WeakMap是键值对,有专属的set和get方法来获取和设置值,
//所以这里给this设置了[],即以this为键名,[]为值,所以该方法形成的队列仍旧是对数组的操作
items.set(this,[]);
}
enqueue(element) {
let q = items.get(this);//这里的q就相当于是[]
q.push(element);
}
dequeue() {
let q = items.get(this);
let r = q.shift();
return r;
}
front() {
return items.get(this)[0];
}
isEmpty() {
return items.get(this).length == 0;
}
size() {
return items.get(this).length;
}
print() {
console.log(items.get(this));
}
}
return Queue;
})()
其实到这里队列就基本介绍完了,但是感觉实在有点糊弄人啊。所以就把剩下的内容都在这一篇文章写完吧。
//声明Queue类
function PriorityQueue() {
//声明并初始化一个用来存放队列元素的数组。
let items = [];
//创建一个拥有优先级的元素类
function QueueElement(element,priority) {
this.element = element;
this.priority = priority;
}
//添加队列元素
this.enqueue = function (element,priority) {
let queueElement = new QueueElement(element,priority);
let added = false;
//遍历队列元素,1的优先级最高,一次类推,如果当前元素优先级大于items[i],那么就把该元素放在items[i]前面。
//splice方法的第二的参数如果为0,那么则把第三个参数添加到i前面。
for(let i = 0; i < items.length; i++) {
if(queueElement.priority < items[i].priority) {
items.splice(i,0,queueElement);
added = true;break;
}
}
// 通过added判断是否可以直接把元素入列。
if(!added) {
items.push(queueElement);
}
};
//移除并返回该队列元素
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;
};
//循环打印元素及其优先级“``”是ES6的模板字符串
this.print = function () {
for(let i = 0; i < items.length; i++) {
console.log(`${items[i].element} - ${items[i].priority}`);
}
};
}
const queue = new PriorityQueue();
console.log(queue.isEmpty()); // outputs true
queue.enqueue('zaking',2);
queue.enqueue('linbo',6);
queue.enqueue('queue',5);
queue.enqueue('ada',3);
queue.enqueue('John',1);
queue.enqueue('Jack',2);
queue.enqueue('Camila',3);
queue.enqueue('zak',3);
queue.print();
主要的更改在于队列元素的设置和enqueue方法,由于需要为每一个循环队列的元素设置优先级,所以这里稍微更改了一下队列的元素,使其带有两个参数(元素自身和优先级),那么既然要根据不同的优先级来插入队列,所以循环队列的enqueue方法也就需要循环整个队列去判断要插入到哪里。
function hotPotato(nameList, num) {
const queue = new Queue();
//把所有的名单(nameList)依次入列
for (let i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i]);
}
//声明当前被淘汰的人员名称
let eliminated = '';
//如果队列中的元素大于一个,说明还没有最后的赢家,如果只剩下一个,就出列该最后赢家
while (queue.size() > 1) {
//循环当前队列num次,把队列头部的“出列元素”再入列。
for (let i = 0; i < num; i++) {
queue.enqueue(queue.dequeue());
}
//循环结束后,出列当前队列的元素,也就是淘汰者。
eliminated = queue.dequeue();
queue.print();
console.log(eliminated + "被淘汰");
}
return queue.dequeue();
}
let names = ["zak","zaking","james","lili","bole","londo","fali"]
console.log(hotPotato(names,7))
上面的方法,每次循环都会依次把头部元素放入到尾部,就实现了一个圈,然后我们以循环结束后,队列最前端的元素视为淘汰,直到最后只剩下一个元素,也就真实的模拟了击鼓传花游戏。
最后,由于本人水平有限,能力与大神仍相差甚远,若有错误或不明之处,还望大家不吝赐教指正。非常感谢!
用js来实现那些数据结构06(队列)的更多相关文章
- 用js来实现那些数据结构—目录
首先,有一点要声明,下面所有文章的所有内容的代码,都不是我一个人独立完成的,它们来自于一本叫做<学习JavaScript数据结构和算法>(第二版),人民邮电出版社出版的这本书.github ...
- 用js来实现那些数据结构及算法—目录
首先,有一点要声明,下面所有文章的所有内容的代码,都不是我一个人独立完成的,它们来自于一本叫做<学习JavaScript数据结构和算法>(第二版),人民邮电出版社出版的这本书.github ...
- javascript数据结构之队列
首先什么是队列? 排队买东西就是生活中队列的实际例子,在队伍中大家必须按照顺序来,不能插队,新来的人只能排在队伍的最后面.新加入的人相当于队列的后端加入的元素,队伍最前面买完东西的人离开队伍相当于是队 ...
- 数据结构之队列(Python 版)
数据结构之队列(Python 版) 队列的特点:先进先出(FIFO) 使用链表技术实现 使用单链表技术,在表首尾两端分别加入指针,就很容易实现队列类. 使用顺序表list实现 # 队列类的实现 cla ...
- C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...
- 数据结构之队列and栈总结分析
一.前言: 数据结构中队列和栈也是常见的两个数据结构,队列和栈在实际使用场景上也是相辅相成的,下面简单总结一下,如有不对之处,多多指点交流,谢谢. 二.队列简介 队列顾名思义就是排队的意思,根据我们的 ...
- (js描述的)数据结构 [数组的一些补充](1)
(js描述的)数据结构 [数组的一些补充](1) 1. js的数组: 1.优点:高度封装,对于数组的操作就是调用API 2.普通语言的数组: 1.优点:根据index来查询,修改数据效率很高 2.缺点 ...
- cb04a_c++_数据结构_STL_queue队列-一般用来做系统软件开发
/*cb04a_c++_数据结构_STL_queue队列-一般用来做系统软件开发队列(只能两端数据)与堆栈(只能一端操作数据)都没有迭代器.,队列:FIFO先进先出自适应容器(容器适配器)栈适配器ST ...
- JS中数据结构之队列
队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按 顺序排列的数据,先进先出. 队列的两种主要操作是:向队列中插入新元素和删除队列中的元素.插入操作也叫做入 队,删除操作也 ...
随机推荐
- 用Canvas写一个简单的游戏--别踩白块儿
第一次写博客也不知怎么写,反正就按照我自己的想法来吧!怎么说呢?还是不要扯那些多余的话了,直接上正题吧! 第一次用canvas写游戏,所以挑个简单实现点的来干:别踩白块儿,其他那些怎么操作的那些就不用 ...
- linux利用ssh远程执行多台机器执行同样的命令
这篇文章主要介绍了ssh远程执行命令方法和Shell脚本实例,本文讲解了ssh执行远程操作方法和远程执行命令shell脚本示例,需要的朋友可以参考下 ssh执行远程操作命令格式代码如下: ssh -t ...
- 让Myeclipse自动生成的get set方法 自动加上文本注释,并且注释内容包含字段中我们加的文档注释
在进行编码写实体类的时候发现,一个实体类有好多的字段要进行注释,他们都是私有的不能直接访问,我们在写的时候加入的文档注释也起不到效果,但是自动生成的get,set方法的文档注释有不符合我们要求(没有包 ...
- 新事物学习---WebApp移动端手势Hammer
花落水流红,闲愁万种,无语怨东风. Hammer介绍 Hammer库是一个移动端手势库,移动端的手势操作(比如touch,tap,拖动,滑动等等)都可以用这个库,而我们不用关心,它的底层方案具体是怎么 ...
- hibernate框架学习笔记5:缓存
缓存不止存在与程序中,电脑硬件乃至于生活中都存在缓存 目的:提高效率 比如IO流读写字节,如果没有缓存,读一字节写一字节,效率低下 hibernate中的一级缓存:提高操作数据库的效率 示例: 抽取的 ...
- DEVC使用问题集锦
一.DEVC++编译出现"Id return 1 exit status" 这是初学者刚用DEVC经常碰到问题,一般有如下解决方法: 1.首先检查下是否有c的exe程序开着,若开着 ...
- Beta阶段敏捷冲刺每日报告——Day0
下一阶段需要改进完善的功能: 搜索框在Firefox和IE中显示不正常问题 下一阶段新增的功能: ToDoList功能:针对博主的功能,在博主登录之后可以添加和修改待办事项,每个事项包括标题.内容.日 ...
- 修改MYSQL的默认连接时长
show global variables like 'wait_timeout'; 设置成10小时; set global wait_timeout=36000;
- shell中冒号 : 用途说明
我们知道,在Linux系统中,冒号(:)常用来做路径的分隔符(PATH),数据字段的分隔符(/etc/passwd)等.其实,冒号(:)在Bash中也是一个内建命令,它啥也不做,是个空命令.只起到占一 ...
- 在ArcGIS中导出现有mxd的style文件
做好的地图包含许多地图符号,这是之前花了很多功夫做的,怎么把它导出来再用呢? 在ArcGIS中右键工具栏,customize,选择command选项卡,在搜索框中输入style ,选择too ...