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 相关文章推荐
chrome浏览器不支持onmouseleave事件的解决技巧
May 31 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
May 12 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
Dec 14 Javascript
JavaScript驾驭网页-DOM
Mar 24 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
Jun 20 Javascript
Websocket协议详解及简单实例代码
Dec 12 Javascript
js实现登录验证码
Dec 22 Javascript
Node.js中文件操作模块File System的详细介绍
Jan 05 Javascript
JS数组去重(4种方法)
Mar 27 Javascript
基于jquery实现五星好评
Nov 18 jQuery
JS实现盒子拖拽效果
Feb 06 Javascript
vue+iview分页组件的封装
Nov 17 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 无限分类的树类代码
2009/12/03 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
PDO::commit讲解
2019/01/27 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
为原生js Array增加each方法
2012/04/07 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
jquery队列函数用法实例
2014/12/16 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
python中的二维列表实例详解
2018/06/19 Python
Python读取YAML文件过程详解
2019/12/30 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
新郎新娘婚礼答谢词
2014/01/11 职场文书
班主任工作经验材料
2014/02/02 职场文书
运动会入场解说词
2014/02/07 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
学习十八大的感悟
2015/08/11 职场文书
离婚财产分割协议书
2015/08/11 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
Python中requests做接口测试的方法
2021/05/30 Python
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android