js 实现数据结构 -- 队列
原文:
概念:
与栈相反,队列是一种遵循先进先出 (FIFO / First In First Out) 原则的一组有序的项;队列在尾部添加新元素,并从头部移除元素。最新添加的元素必须排在队列的末尾。在现实中,最常见的例子就是排队,吃饭排队、银行业务排队、公车的前门上后门下机制...,前面的人优先完成自己的事务,完成之后,下一个人才能继续。常见的应用形式是视频网站的缓冲以及打印队列。
基础队列:
class Queue {
constructor(items) {
this.items = items || [];
}
// 入列
enqueue(ele) {
this.items.push(ele);
}
// 出列
dequeue() {
this.items.shift();
}
//
front() {
return this.items[0];
}
clear() {
this.items = [];
}
get size() {
return this.items.length;
}
get isEmpty() {
return !this.items.length;
}
print() {
console.log(this.items.toString());
}
}
let queue = new Queue()
console.log(queue.isEmpty) // true
queue.enqueue('John')
queue.enqueue('Jack')
queue.enqueue('Camila')
console.log(queue.size) // 3
console.log(queue.isEmpty) // false
queue.dequeue()
queue.dequeue()
queue.print() // 'Camila'
优先队列:
如医院的急诊,虽然都有专门的急诊科,但是就理解而言严重程度高的可以先就诊。优先队列可以根据优先级进行排列。
实现思路也简单,普通队列直接 push 元素,那么优先队列就是插入包含优先级的对象,插入前先进行优先级验证,在相应位置插入元素。
下例实现根据优先级插入数据,出列操作同普通队列。
class PriorityQueue {
constructor() {
this.items = [];
}
get isEmpty() {
return !this.items.length;
}
get size() {
return this.items.length;
}
enqueue(ele, priority) {
let queueEle = { ele, priority };
if (this.isEmpty) {
this.items.push(queueEle);
} else {
let preIndex = this.items.findIndex(item => queueEle.priority < item.priority);
if (preIndex > -1) {
this.items.splice(preIndex, 0, queueEle);
} else {
this.items.push(queueEle);
}
}
}
dequeue() {
return this.items.shift();
}
front() {
return this.items[0];
}
clear() {
this.items = [];
}
print() {
console.log(this.items)
}
}
let priorityQueue = new PriorityQueue()
priorityQueue.enqueue('John', 2)
priorityQueue.enqueue('Jack', 1)
priorityQueue.enqueue('Camila', 1)
priorityQueue.enqueue('Surmon', 3)
priorityQueue.enqueue('skyRover', 2)
priorityQueue.enqueue('司马萌', 1)
priorityQueue.print()
console.log(priorityQueue.isEmpty, priorityQueue.size) // false 6
循环队列:
循环队列在概念上就是将队尾和队首闭环。
为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。

js 实现的循环队列:(基于普通队列)
class Queue {
constructor(items) {
this.items = items || [];
}
// 入列
enqueue(ele) {
this.items.push(ele);
}
// 出列
dequeue() {
this.items.shift();
}
//
front() {
return this.items[0];
}
clear() {
this.items = [];
}
get size() {
return this.items.length;
}
get isEmpty() {
return !this.items.length;
}
print() {
console.log(this.items.toString());
}
}
class LoopQueue extends Queue {
constructor(items) {
super(items)
}
getIndex(index) {
let length = this.items.length;
return index > length ? index % length : index;
}
findIndex(index) {
return !this.isEmpty ? this.items[this.getIndex(index)] : null;
}
}
const loopQueue = new LoopQueue(['Surmon'])
loopQueue.enqueue('SkyRover')
loopQueue.enqueue('Even')
loopQueue.enqueue('Alice')
console.log(loopQueue.size, loopQueue.isEmpty) // 4 false
console.log(loopQueue.find(26)) // 'Evan'
console.log(loopQueue.find(87651)) // 'Alice'
js 实现数据结构 -- 队列的更多相关文章
- (js描述的)数据结构[队列结构,优先级队列](3)
(js描述的)数据结构[队列结构](3) 一.队列结构的特点: 1.基于数组来实现,的一种受限的线性结构. 2.只允许在表头进行删除操作,在表尾进行插入操作. 3.先进先出(FIFO) 二.队列的一些 ...
- 再谈js对象数据结构底层实现原理-object array map set
如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...
- java 数据结构 队列的实现
java 数据结构队列的代码实现,可以简单的进行入队列和出队列的操作 /** * java数据结构之队列的实现 * 2016/4/27 **/ package cn.Link; import java ...
- C++ 泛型 编写的 数据结构 队列
平时编程里经常需要用到数据结构,比如 栈和队列 等, 为了避免每次用到都需要重新编写的麻烦现将 C++ 编写的 数据结构 队列 记录下来,以备后用. 将 数据结构 队列 用头文件的形式写成 ...
- C语言数据结构-队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-队列的实现-C语言 //队列的存储结构 #define MAXSIZE 100 typedef struct { int* base; //基地址 int _front; //头指针 i ...
- java数据结构——队列、循环队列(Queue)
每天进步一点点,坚持就是成功. 1.队列 /** * 人无完人,如有bug,还请斧正 * 继续学习Java数据结构————队列(列队) * 队列和栈一样,都是使用数组,但是队列多了一个队头,队头访问数 ...
- [从今天开始修炼数据结构]队列、循环队列、PriorityQueue的原理及实现
[从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...
- 数据结构--队列(Java实现)
数据结构--队列(Java实现) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 队列是一种特殊的线性表,特殊之处在于它只 ...
- JS数据结构——队列
创建一个自己的类来表示一个队列 function Queue() { //这里写属性和方法 } 首先需要一个用于存储队列中元素的数据结构,可以用数组 let items = [] 接下来声明一些队列可 ...
随机推荐
- 程序员50题(JS版本)(三)
程序11:判断101~200之间有多少个素数,并输出所有素数 for(var i=101,num=0;i<=200;i++){ for(var j=2;j<=i;j++){ if(i%j= ...
- CSS-蜂窝状展示区域(多个六边形)的一种实现方式
网上已经有很多关于正六边形的CSS画法,主要是利用一个矩形和前后的两个三角形组合而成. 之前在看四维图新的官网的时候,发现了一种六边形的画法,比较适合多排六边形组合成蜂窝状的展示区域(注:四维图新现在 ...
- AEAI HR开源人力资源管理v1.6.0发版公告
1 升级说明 AEAI HR v1.6.0版是AEAI HR v1.5.2版人力资源管理系统的升级版本,本次升级的系统是基于AEAI DP 3.8.0_20170228进行打包部署的,升级内容主要是针 ...
- OpenUDID 和 IDFA 比较
iOS标识符 现今来比较下,不同情况下两种标识符的变化情况.以下试验,每种标识符均分为存于Keychain和未存于Keychain的两种情况做比较. 广告标识符(IDFA-identifierForI ...
- Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost
Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost 问题:Tomcat服务器的端口被占用 解决: ...
- 总结XSS与CSRF两种跨站攻击
XSS:跨站脚本(Cross-site scripting),实际应是"CSS",但由于和层叠样式表CSS名称冲突,故改为"XSS" CSRF:跨站请求伪造(C ...
- MySQL常用命令汇总(偏向运维管理)
基础部分 1. select @@version; ##查询当前mysql的版本. 2. show variables like 'port';##查看mysql实例的端口. 3. show vari ...
- LNMP时,出现502 Bad Gateway的错误提示
因为工作需要,要在ubuntu中安装LNMP环境,在这里,php是最新版本php7.1.一切都进展得很顺利,安装完成后,在浏览器中输入http://127.0.0.1/info.php,出现了502 ...
- 英语口语练习系列-C09-常用动词
<先秦 · 关雎> 关关雎鸠,在河之洲.窈窕淑女,君子好逑. 参差荇菜,左右流之.窈窕淑女,寤寐求之. 求之不得,寤寐思服.悠哉悠哉,辗转反侧. 参差荇菜,左右采之.窈窕淑女,琴瑟友之. ...
- python import详解
1.import作用 引入模块 2.import的特点 一个程序中,import的模块不会重复被引用,如: # test1.py import test2 print test2.attr # tes ...