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 表格排序和表头浮动效果(扩展SortTable)
Apr 07 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
Oct 18 Javascript
js实现网站首页图片滚动显示
Feb 04 Javascript
javascript实现颜色渐变的方法
Oct 30 Javascript
JQuery中$.each 和$(selector).each()的区别详解
Mar 13 Javascript
jQuery实现无限往下滚动效果代码
Apr 16 Javascript
原生js编写基于面向对象的分页组件
Dec 05 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
Aug 16 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
Dec 23 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
Jun 07 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
Feb 19 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
Dec 10 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学习 运算符与运算符优先级
2008/06/15 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php 地区分类排序算法
2013/07/01 PHP
php根据年月获取季度的方法
2014/03/31 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
bootstrap table实例详解
2017/01/06 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
Python基于多线程实现ping扫描功能示例
2018/07/23 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
python实现机器人卡牌
2019/10/06 Python
公司综合部的成员自我评价分享
2013/11/05 职场文书
《春晓》教学反思
2014/04/20 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
经济管理自荐书
2014/06/09 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL