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 相关文章推荐
javascript静态的url如何传递
May 03 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
Mar 07 Javascript
JavaScript中的正则表达式简明总结
Apr 04 Javascript
jQuery回调函数的定义及用法实例
Dec 23 Javascript
使用AngularJS 应用访问 Android 手机的图片库
Mar 24 Javascript
js和jquery实现监听键盘事件示例代码
Jun 24 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
利用vue写todolist单页应用
Dec 15 Javascript
vue router自动判断左右翻页转场动画效果
Oct 10 Javascript
详解VS Code使用之Vue工程配置format代码格式化
Mar 20 Javascript
js实现图片上传到服务器和回显
Jan 19 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
ThinkPHP模板IF标签用法详解
2014/07/01 PHP
Chrome Web App开发小结
2014/09/04 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
详解webpack自定义loader初探
2018/08/29 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
跟老齐学Python之关于类的初步认识
2014/10/11 Python
Python可变参数用法实例分析
2017/04/02 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
对python 自定义协议的方法详解
2019/02/13 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
英格兰足协官方商店:England Store
2019/07/12 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
学校七一活动方案
2014/01/19 职场文书
庆七一活动方案
2014/01/25 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
作文评语集锦大全
2014/04/23 职场文书
五四青年节优秀演讲稿范文
2014/05/28 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
化工生产实习心得体会
2016/01/22 职场文书
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android