笔试算法须知---用JS实现队列处理问题
2017-09-26 13:25
525 查看
队列
普通队列 先进先出FIFO循环队列 队首出队后,又从队尾入队
优先队列
如果优先值小的元素放到队列的前面,这叫做最小优先队列
反之优先值大的元素放到队列的前面,这叫做最大优先队列
队列的操作(就是医院看病排队)
向队列中添加元素(进入排队的队伍中)--push
移除队头元素(队伍最前面的人出队,进诊室)--shift
查看队头元素(查看队伍最前面的人)--front
判断队列是否为空(看看队伍中有没有人)--isEmpty
移除队伍全部元素(下班了,都走了吧)--clear
查看栈里元素个数(查看排队的有多少人)--size
实现一个队列类
function Queue(){ var queueData = []; // FIFO=Fisrt In First Out this.push = function(element){//入队操作---在数组尾插入新元素 queueData.push(element); return queueData; }; this.shift = function(element){//出队操作---在数组头删除元素 return shiftElement = queueData.shift(element); }; this.front = function(){ return queueData[0]; }; this.size = function(){ return queueData.length; }; this.isEmpty = function(){ return queueData.length == 0; } this.clear = function(){ queueData = []; } this.print = function(){ console.log(queueData.toString()) } }
最小优先队列
function PriorityQueue(){ var queueData = []; function QueEle(element,priority){ this.element = element; this.priority = priority; } //-----------与普通队列的不同是在入队过程中判断优先级,来确定元素在队列该插入的位置。 this.push = function(element,priority){ var queObj = new QueEle(element,priority); if(this.isEmpty()){ this.push(queObj); }else{ var flag = false; for(var i=0;i<queueData.length;i++){ if(queObj.priority<queueData[i].priority){ //判断优先级,优先级小的放在优先级大的前面, queueData.splice(i, 0, queObj);//插入元素 flag = true; break; } } if(!flag){ queueData.push(queObj); } } } this.shift = function(element){//出队操作---在数组头删除元素 return shiftElement = queueData.shift(element); }; this.front = function(){ return queueData[0]; }; this.size = function(){ return queueData.length; }; this.isEmpty = function(){ return queueData.length == 0; } this.clear = function(){ queueData = []; } this.print = function(){ var temp = []; for(var j=0;j<queueData.len;j++){ temp.push(queueData[i].ele);//只输出元素的名字 } console.log(temp.toString()); } }
循环队列--击鼓传花问题
核心代码就是将队列变成循环队列,按照给定的次数循环队列后,将队首的元素出队,直到队列的长度为1。结束队列,返回队列中存在的最后一个值。
function JGCH(namelists,num){//nameList为姓名数组,num为一个数字用来迭代队列 var hua = new Queue(); for(var m=0;m<namelists.length;m++){ hua.push(namelists[m]);//将传入的数组存入队列中 }; var loser; while(hua.size()>1){ for(var n=0;n<num;n++){ hua.push(hua.shift());//出队后入队,形成循环队列 } loser = hua.shift(); console.log(loser+"淘汰");//每一次迭代完成后,将队首的出队 } return hua.shift(); }//详细代码及测试用例如下
击鼓传花结果
希望我的总结或许能帮到大家一丢丢,加油!!!
相关文章推荐
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
- 笔试算法题(12):整数的string到int转换 & 两个栈实现队列
- 使用消息队列+js实现分布式服务器热切换业务处理功能
- js队列的实现问题
- 笔试算法题(55):快速排序实现之三路划分, 三元中值法和插入排序处理小子文件
- 数据结构和算法设计(迷宫求解问题的栈和队列的实现)
- 要求顺序循环队不损失一个空间,全部能够得到有效利用,试采用设置标志位tag的方法解决“假溢出”问题,实现顺序循环队列算法
- php处理表单中的复选框问题以及js实现全选
- 用js写的一个形式为##.dd的动态小数掩码问题,可以处理负值 NumberMask
- 老问题:js实现gridview中的全选和反选
- 利用HttpHandler处理自定义控件中需要引用大量js文件问题
- 利用timestamp实现数据库处理同一记录的时间差异问题
- C# A*算法实现8数或者15数问题
- js+ajax实现的A*游戏路径算法整理第1/2页
- 转-C# A*算法实现8数或者15数问题
- Gossip数学问题算法的程序实现
- Java 线程同步问题 生产者-消费者 算法实现 -Java学习笔记(29)
- 利用HttpHandler处理自定义控件中需要引用大量js文件问题
- AIX 程序设计大赛-AIX正方形问题算法及Java程序实现(方案三)
- [导入]C# A*算法实现8数或者15数问题