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 相关文章推荐
中国地区三级联动下拉菜单效果分析
Nov 15 Javascript
web网页按比例显示图片实现原理及js代码
Aug 09 Javascript
javascript框架设计之框架分类及主要功能
Jun 23 Javascript
详细解读JavaScript的跨浏览器事件处理
Aug 12 Javascript
理解jquery事件冒泡
Jan 03 Javascript
对称加密与非对称加密优缺点详解
Feb 06 Javascript
JavaScript Uploadify文件上传实例
Feb 28 Javascript
Angularjs实现多图片上传预览功能
Jul 18 Javascript
如何用JavaScript实现功能齐全的单链表详解
Feb 11 Javascript
jQuery实现的隔行变色功能【案例】
Feb 18 jQuery
javascript实现自由编辑图片代码详解
Jun 21 Javascript
vue 中this.$set 动态绑定数据的案例讲解
Jan 29 Vue.js
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知识收集
2012/08/20 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
2017/11/17 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
深入理解Python中装饰器的用法
2016/06/28 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
python中if嵌套命令实例讲解
2021/02/25 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
竞职演讲稿范文
2014/01/11 职场文书
暑期培训班策划方案
2014/08/26 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书