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 ajax(复习)—Baidu ajax request分离版
Jan 24 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
Dec 12 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
Feb 25 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
Dec 02 Javascript
JavaScript基础——使用Canvas绘图
Nov 02 Javascript
jQuery实现可移动选项的左右下拉列表示例
Dec 26 Javascript
Vue2.x中的Render函数详解
May 30 Javascript
从setTimeout看js函数执行过程
Dec 19 Javascript
Vuepress 搭建带评论功能的静态博客的实现
Feb 17 Javascript
vue鼠标悬停事件实例详解
Apr 01 Javascript
Vue搭建后台系统需要注意的问题
Nov 08 Javascript
Node在Controller层进行数据校验的过程详解
Aug 28 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开发过程中关于继承的使用方法分享
2011/06/17 PHP
php中json_encode中文编码问题分析
2011/09/13 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
原生js实现商品筛选功能
2019/10/28 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
python通过smpt发送邮件的方法
2015/04/30 Python
Python3 jupyter notebook 服务器搭建过程
2018/11/30 Python
python实现词法分析器
2019/01/31 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
python读取Kafka实例
2019/12/23 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
介绍一下Linux中的链接
2016/05/28 面试题
自动化专业个人求职信范文
2013/11/29 职场文书
领导调研接待方案
2014/02/27 职场文书
作风整顿剖析材料
2014/09/30 职场文书
师德师风整改措施
2014/10/24 职场文书
孔庙导游词
2015/02/04 职场文书
高中教师个人总结
2015/02/10 职场文书
演讲开场白台词大全
2015/05/29 职场文书
关于五一放假的通知
2015/08/18 职场文书