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系列(15) 函数(Functions)
Apr 12 Javascript
jquery使用hide方法隐藏指定id的元素
Mar 30 Javascript
Javascript类型系统之String字符串类型详解
Jun 21 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
Aug 11 Javascript
JSON 对象未定义错误的解决方法
Sep 29 Javascript
解决Angular.Js与Django标签冲突的方案
Dec 20 Javascript
vue之数据交互实例代码
Jun 20 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
Apr 25 Javascript
JavaScript中将值转换为字符串的五种方法总结
Jun 06 Javascript
Vuex模块化应用实践示例
Feb 03 Javascript
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
vue实现锚点定位功能
Jun 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开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
python删除文件示例分享
2014/01/28 Python
python的三目运算符和not in运算符使用示例
2014/03/03 Python
python求列表交集的方法汇总
2014/11/10 Python
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
中专生自荐信
2013/10/12 职场文书
师范大学应届生求职信
2013/11/21 职场文书
关于赌博的检讨书
2014/01/24 职场文书
挂牌仪式主持词
2014/03/20 职场文书
财务工作个人总结
2015/02/27 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS