用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中数据结构之队列
队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按 顺序排列的数据,先进先出. 队列的两种主要操作是:向队列中插入新元素和删除队列中的元素.插入操作也叫做入 队,删除操作也 ...
随机推荐
- 设计模式 --> (1)工厂模式
工厂模式 工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 适用性: 例如部署多种数据库的情况,可能在不同的地方要使用不同的数据库,此时只需要在配置文件中设定数据库 ...
- SQL注入之Sqli-labs系列第一篇
在开始接触渗透测试开始,最初玩的最多的就是Sql注入,注入神器阿D.明小子.穿山甲等一切工具风靡至今.当初都是以日站为乐趣,从安全法实施后在没有任何授权的情况下,要想练手只能本地环境进行练手,对于sq ...
- node.js应用脚手架:koa2、sequelize、mysql
自制了一个 nodejs 应用的脚手架. 基于 koa2 的,所以需要保证 node 环境至少为 7.6.0 吸取了以前的踩坑教训,添加了守护进程,确保应用不会因为异常导致网站直接挂掉(使用了 for ...
- 庖丁解牛Linux内核学习笔记(1)--计算机是如何工作的
存储程序计算机模型 冯诺依曼体系结构 冯诺依曼体系结构是存储程序计算机,什么叫存储程序计算机?从硬件角度说,假设有cpu和内存,两者通过总线连接,在cpu内部有一个寄存器叫ip(instruction ...
- 敏捷冲刺每日报告--day2
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team ...
- Linux进程管理之task_struct结构体
进程是处于执行期的程序以及它所管理的资源(如打开的文件.挂起的信号.进程状态.地址空间等等)的总称.注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源. ...
- python简单路由系统
# 输入模块名/函数 url = input('请输入网址:') module,func = url.split('/') m = __import__('lib.'+module,fromlist= ...
- SpringMVC之HandlerMapping的使用
上篇博客在了解SpringMVC的工作流程时留了一些疑问,今天先学习下HandlerMapping,在HandlerMapping中可以通过HandlerExecutionChain getHandl ...
- ASP.NET MVC中错误处理方式
/// <summary> /// 标记了HandleError,并指明错误处理页为AboutError.aspx /// </summary> /// <returns ...
- C#之Socket通信
0.虽然之前在项目中也有用过Socket,但始终不是自己搭建的,所以对Server,Clinet端以及心跳,断线重连总没有很深入的理解,现在自己搭建了一遍加深一下理解. 服务端使用WPF界面,客户端使 ...