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 相关文章推荐
JQuery 风格的HTML文本转义
Jul 01 Javascript
JavaScript DOM 学习第七章 表单的扩展
Feb 19 Javascript
javascript的数据类型、字面量、变量介绍
May 23 Javascript
js实现非常简单的焦点图切换特效实例
May 07 Javascript
C++中的string类的用法小结
Aug 07 Javascript
javascript html实现网页版日历代码
Mar 08 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
Mar 30 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
Oct 17 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
Dec 29 Javascript
layui表单验证select下拉框实现验证的方法
Sep 05 Javascript
layer弹出层取消遮罩的方法
Sep 25 Javascript
vue与django集成打包的实现方法
Nov 11 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 cookie 登录验证示例代码
2009/03/16 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
php获取远程文件内容的函数
2015/11/02 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
javascript比较两个日期相差天数的方法
2015/07/24 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
python复制文件的方法实例详解
2015/05/22 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
python 读写、创建 文件的方法(必看)
2016/09/12 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
django 自定义过滤器的实现
2019/02/26 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
请解释接口的显式实现有什么意义
2012/05/26 面试题
关于工资低的辞职信
2014/01/14 职场文书
师范学院教师自荐书
2014/01/31 职场文书
协议书范本
2014/04/23 职场文书
项目建议书范文
2014/05/12 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis
React forwardRef的使用方法及注意点
2021/06/13 Javascript
html form表单基础入门案例讲解
2021/07/15 HTML / CSS