js数据结构——队列
2017-01-22 00:00
176 查看
摘要: js数据结构——队列
一、
1.创建队列
(1)上面代码利用数组和数组的push()和shift()方法实现进队和出队
2.使用队列
二、优先队列
1.创建优先队列
所谓优先队列,就是在元素添加和删除的时候是基于优先级的。
1.创建一个元素对象,有两个属性,元素值和元素优先级
2.入队,首先想到,最开始是空队,if(this.empty()),直接入队
3.如果不是空队,先设置找到插入位标记(flag = false),然后遍历已有队列中的元素,比较优先级大小,优先级数值小的(及优先级大的在前)
4.判断条件,如果元素的优先级数值大于队列中元素的优先级数值,进入下一次循环。
5。如果满足元素的优先级数值小于队列中元素的优先级数值,flag置为true,表示已经找到插入位,并用splice方法添加元素.
6.如果flag还是为flase,说明队列中所有元素的优先级数值都比要插入的数值小,所以直接入队就可以了
(1)每次入队的是一个对象,根据priority属性排序,根据element属性取值。
2.使用优先队列
(2)值得注意的是,每一次进队一个元素时,前面的总是已经排好序的……。
三、循环队列
通过将将出队元素进队实现循环队列
所以,循环队列可以基于普通队列实现
例:击鼓传花游戏
(1)上述代码要有“一”中的普通队列代码位基础
(2)如果直接在数组中遍历,很难获取他应该删除的位置,利用队列,每执行一次把元素放到队首,删除时,直接删除队首元素即可。
(3)两个循环条件,一个是queue.size()>0,保证剩余一个元素,另一个i<num,表示设定的循环次数
一、
1.创建队列
function Queue(){ var items = []; if(typeof this.enqueue != "function"){ //进队 Queue.prototype.enqueue = function(element){ items.push(element); }; //出队 Queue.prototype.dequeue = function(){ return items.shift(); }; //返回队列中的第一个元素 Queue.prototype.front = function(){ return items[0]; }; //判断是否空队 Queue.prototype.isEmpty = function(){ return items.length == 0; }; //清空队列 Queue.prototype.clear = function(){ items = []; }; //返回队列大小 Queue.prototype.size = function(){ return items.length; }; //打印 Queue.prototype.print = function(){ console.log(items.toString()); }; } }
(1)上面代码利用数组和数组的push()和shift()方法实现进队和出队
2.使用队列
var queue = new Queue(); //入队并打印 queue.enqueue(5); queue.enqueue(1); queue.enqueue(8); queue.enqueue(2); queue.enqueue(4); queue.print(); //5,1,8,2,4 //返回第一个元素并打印 console.log(queue.front()); //5 queue.print(); //5,1,8,2,4 //出队一个元素并打印,输出大小 queue.dequeue(); queue.print(); //1,8,2,4 console.log(queue.size()); //4 //清空队列并判空 queue.clear(); console.log(queue.isEmpty());//true
二、优先队列
1.创建优先队列
所谓优先队列,就是在元素添加和删除的时候是基于优先级的。
1.创建一个元素对象,有两个属性,元素值和元素优先级
2.入队,首先想到,最开始是空队,if(this.empty()),直接入队
3.如果不是空队,先设置找到插入位标记(flag = false),然后遍历已有队列中的元素,比较优先级大小,优先级数值小的(及优先级大的在前)
4.判断条件,如果元素的优先级数值大于队列中元素的优先级数值,进入下一次循环。
5。如果满足元素的优先级数值小于队列中元素的优先级数值,flag置为true,表示已经找到插入位,并用splice方法添加元素.
6.如果flag还是为flase,说明队列中所有元素的优先级数值都比要插入的数值小,所以直接入队就可以了
function PriorityQueue(){ var items = []; function QueueElement(element,priority){ this.element = element; this.priority = priority; } if(typeof this.enqueue != "function"){ //进队 PriorityQueue.prototype.enqueue = function(element,priority){ var queueElement = new QueueElement(element,priority); if(this.isEmpty()){ items.push(queueElement); }else{ var flag = false; for(var i = 0;i < items.length;i++){ if(queueElement.priority < items[i].priority){ flag = true; items.splice(i,0,queueElement); break; } } if(!flag){ items.push(queueElement) } } }; //出队 PriorityQueue.prototype.dequeue = function(){ return items.shift(); }; //返回队列中的第一个元素 PriorityQueue.prototype.front = function(){ return "->"+items[0].element+","+items[0].priority; }; //判断是否空队 PriorityQueue.prototype.isEmpty = function(){ return items.length == 0; }; //清空队列 PriorityQueue.prototype.clear = function(){ items = []; }; //返回队列大小 PriorityQueue.prototype.size = function(){ return items.length; }; //重写toString方法 PriorityQueue.prototype.toString = function(){ } //打印 PriorityQueue.prototype.print = function(){ for(var i = 0;i < items.length;i++){ console.log("("+items[i].element+","+items[i].priority+")"); } }; } }
(1)每次入队的是一个对象,根据priority属性排序,根据element属性取值。
2.使用优先队列
var queue = new PriorityQueue(); //入队并打印 queue.enqueue(5,1); queue.enqueue(1,1); queue.enqueue(8,3); queue.enqueue(2,5); queue.enqueue(4,6); queue.print(); //(5,1),(1,1),(8,3),(2,5),(4,6) //返回第一个元素并打印 console.log(queue.front()); //->5,1 queue.print(); //(5,1),(1,1),(8,3),(2,5),(4,6) //出队一个元素并打印,输出大小 queue.dequeue(); queue.print(); //(1,1),(8,3),(2,5),(4,6) console.log(queue.size()); //4 //清空队列并判空 queue.clear(); console.log(queue.isEmpty());//true
(2)值得注意的是,每一次进队一个元素时,前面的总是已经排好序的……。
三、循环队列
通过将将出队元素进队实现循环队列
所以,循环队列可以基于普通队列实现
例:击鼓传花游戏
function whoWin(nameList,num){ var queue = new Queue(); //初始化队列 for(var i = 0;i < nameList.length;i++){ queue.enqueue(nameList[i]) } //当队列的大小大于1的时候重复num次,把队首元素放到队尾,然后出队队首元素 var pass = ''; while(queue.size() > 1){ for(var i = 0;i < num;i++) { queue.enqueue(queue.dequeue()); } pass = queue.dequeue(); console.log(pass+"在击鼓传花游戏中被淘汰"); } return queue.front(); } var names = ['wjj','wjw','wjy','wyc','wak','wp']; var winner = whoWin(names,7); console.log("胜利者:"+winner);
(1)上述代码要有“一”中的普通队列代码位基础
(2)如果直接在数组中遍历,很难获取他应该删除的位置,利用队列,每执行一次把元素放到队首,删除时,直接删除队首元素即可。
(3)两个循环条件,一个是queue.size()>0,保证剩余一个元素,另一个i<num,表示设定的循环次数
相关文章推荐
- js:数据结构笔记3--栈
- js:数据结构笔记8--集合
- 做省市区联动时,用node.js将数据调整到合适结构的两种常用方法
- Vue.js搭建移动端购物车界面-基本结构和数据渲染
- 数据结构与算法的js描述总结
- 【福利】【已送出几本,更新下】囤积书放送(oracle,java web,js,jquery,rcp,android,数据结构设计模式。。。。。)
- js将有父子关系的数据转换成树形结构数据
- js数据结构——链表(一)
- js数据结构——链表(二)
- js中数据结构数组Array、映射Map、集合Set、对象、JSON
- 用数组实现js中的堆栈 或者队列数据结构
- 【4】学习JS 数据结构与算法笔记
- 使用js进行二叉树结构数据与数组结构数据的互相转化
- 001 - JS算法与数据结构之A*寻路
- JS实现的MAP结构数据
- js:数据结构笔记7--哈希表
- js根据id、pid把数据转为树结构
- js 数据结构与算法 更新ing
- js数据结构与算法----树
- 数据结构:用JS实现栈