JavaScript数据结构之优先队列与循环队列实例详解


Posted in Javascript onOctober 27, 2017

本文实例讲述了JavaScript数据结构之优先队列与循环队列。分享给大家供大家参考,具体如下:

优先队列

实现一个优先队列:设置优先级,然后在正确的位置添加元素。

我们这里实现的是最小优先队列,优先级的值小(优先级高)的元素被放置在队列前面。

//创建一个类来表示优先队列
function Priorityqueue(){
  var items=[];//保存队列里的元素
  function QueueEle(e,p){//元素节点,有两个属性
    this.element=e;//值
    this.priority=p;//优先级
  }
  this.enqueue=function(e,p){//添加一个元素到队列尾部
    var queueEle=new QueueEle(e,p);
    var added=false;
    //priority小的优先级高,优先级高的在队头
    if(this.isEmpty()){
      items.push(queueEle);
    }else{
      for(var i=0;i<items.length;i++){
        if(items[i].priority>queueEle.priority){
          items.splice(i,0,queueEle);
          added=true;
          break;
        }
      }
      if(!added){
        items.push(queueEle);
      }
    }
  }
  this.isEmpty=function(){
    return items.length==0;
  }
  this.dequeue=function(){
    return items.shift();
  }
  this.clear=function(){
    items=[];
  }
  this.print=function(){
    console.log(items);
  }
  this.mylength=function(){
    return items.length;
  }
}
var pqueue=new Priorityqueue();
pqueue.enqueue('a',2);
pqueue.enqueue('b',1);
pqueue.enqueue('c',2);
pqueue.enqueue('d',2);
pqueue.enqueue('e',1);
pqueue.print();
//[ QueueEle { element: 'b', priority: 1 },
// QueueEle { element: 'e', priority: 1 },
// QueueEle { element: 'a', priority: 2 },
// QueueEle { element: 'c', priority: 2 },
// QueueEle { element: 'd', priority: 2 } ]

运行结果:

JavaScript数据结构之优先队列与循环队列实例详解

在正确的位置添加元素:如果队列为空,可以直接将元素入列。否则,就需要比较该元素与其他元素的优先级。当找到一个比要添加的元素优先级更低的项时,就把新元素插入到它之前,这样,对于其他优先级相同,但是先添加到队列的元素,我们同样遵循先进先出的原则。

最大优先队列:优先级的值大的元素放置在队列前面。

循环队列

实现击鼓传花游戏。

//创建一个类来表示队列
function Queue(){
  var items=[];//保存队列里的元素
  this.enqueue=function(e){//添加一个元素到队列尾部
    items.push(e);
  }
  this.dequeue=function(){//移除队列的第一项,并返回
    return items.shift();
  }
  this.front=function(){//返回队列的第一项
    return items[0];
  }
  this.isEmpty=function(){//如果队列中部包含任何元素,返回true,否则返回false
    return items.length==0;
  }
  this.mylength=function(){//返回队列包含的元素个数
    return items.length;
  }
  this.clear=function(){//清除队列中的元素
    items=[];
  }
  this.print=function(){//打印队列中的元素
    console.log(items);
  }
}
//击鼓传花
function hotPotato(namelist,num){
  var queue=new Queue();
  for(var i=0;i<namelist.length;i++){
    queue.enqueue(namelist[i]);
  }
  var eliminated='';
  while(queue.mylength()>1){
    for(i=0;i<num;i++){
      queue.enqueue(queue.dequeue());
    }
    eliminated=queue.dequeue();
    console.log("淘汰"+eliminated);
  }
  return queue.dequeue();
}
var namelist=['a','b','c','d','e'];
var winner=hotPotato(namelist,7);
console.log(winner+"获胜");
//淘汰c
//淘汰b
//淘汰e
//淘汰d
//a获胜

运行结果:

JavaScript数据结构之优先队列与循环队列实例详解

得到一份名单,把里面的名字全都加入队列。给定一个数字,然后迭代队列。从队列头移除一项,加入到队列尾部,模拟循环队列。一旦传递次数达到给定的数字,拿到花的那个人就被淘汰。最后只剩一个人的时候,他就是胜利者。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
prototype Element学习笔记(篇一)
Oct 26 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
Jun 17 Javascript
JS随机生成不重复数据的实例方法
Jul 17 Javascript
用jquery实现的一个超级简单的下拉菜单
May 18 Javascript
js中使用使用原型(prototype)定义方法的好处详解
Jul 04 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
Nov 07 Javascript
jQuery插件开发发送短信倒计时功能代码
May 09 jQuery
JS/jQuery实现DIV延时几秒后消失或显示的方法
Feb 12 jQuery
JS实现调用本地摄像头功能示例
May 18 Javascript
Vue结合后台导入导出Excel问题详解
Feb 19 Javascript
vue基于v-charts封装双向条形图的实现代码
Dec 09 Javascript
你不知道的SpringBoot与Vue部署解决方案
Nov 09 Javascript
Express系列之multer上传的使用
Oct 27 #Javascript
微信小程序返回多级页面的实现方法
Oct 27 #Javascript
微信小程序-getUserInfo回调的实例详解
Oct 27 #Javascript
基于JavaScript实现报警器提示音效果
Oct 27 #Javascript
JavaScript数据结构之双向链表定义与使用方法示例
Oct 27 #Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
Oct 27 #jQuery
动态统计当前输入内容的字节、字符数的实例详解
Oct 27 #Javascript
You might like
PHP开发文件系统实例讲解
2006/10/09 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
Python中分数的相关使用教程
2015/03/30 Python
Python中用Spark模块的使用教程
2015/04/13 Python
在django中使用自定义标签实现分页功能
2017/07/04 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
蔻驰法国官网:COACH法国
2018/11/14 全球购物
门前三包责任书
2014/04/15 职场文书
任命书模板
2014/06/04 职场文书
公民授权委托书
2014/10/15 职场文书
预防艾滋病宣传活动总结
2015/05/09 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫
APP界面设计技巧和注意事项
2022/04/29 杂记
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL