JavaScript队列、优先队列与循环队列


Posted in Javascript onNovember 14, 2016

队列是一种遵从先进先出(FIFO)原则的有序集合
队列在尾部添加新元素,从顶部移除元素

队列的理解

队列在我们生活中最常见的场景就是排队了
队列这个名字也已经很通俗易懂了

JavaScript队列、优先队列与循环队列

和栈很像,这不过队列是先入先出的数据结构

JavaScript队列、优先队列与循环队列

队列的前面是队头
队列的后面是队尾
出队从队头出
入队从队尾入

队列的创建

和栈类似,这里我就不就不??铝
同样需要实现一些功能
这里我类比生活中的排队上厕所

  • 向队列中添加元素(进入排队的队伍中)
  • 移除队头元素(队伍最前面的人出队进入厕所)
  • 查看队头元素(查看队伍最前面的人)
  • 判断队列是否为空(看看队伍中有没有人)
  • 移除队伍全部元素(厕所炸了,都散了吧)
  • 查看栈里元素个数(查看排队的有多少人)

于是我们可以创建一个完整队列实现,同样是利用我们的数组实现
数组头就是队列头

function Queue() {
  var items = [];
  this.enqueue = function (ele) {
    items.push(ele);
  };//入队
  this.dequeue = function () {
    return items.shift();
  };//出队
  this.front = function () {
    return items[0];
  };//查看队头元素
  this.isEmpty = function () {
    return items.length === 0;
  };//判断队列是否为空
  this.size = function () {
    return items.length;
  };//队列大小
  this.clear = function () {
    items = [];
  };//清空队列
  this.print = function () {
    console.log(items.toString());
  };//打印队列
}
var queue = new Queue(); //声明队列的实例

队列的使用

下面我们就用这个队列简单模拟排队

var queue = new Queue();
console.log("队列是否为空: " + queue.isEmpty());
queue.enqueue('Mr.A');
queue.enqueue('Mr.B');
queue.enqueue('Mr.C');
console.log("当前队列:");
queue.print();
console.log("出队的人: " + queue.dequeue());
console.log("当前队列:");
queue.print();

控制台打印:

JavaScript队列、优先队列与循环队列

优先队列

在我们排队上厕所的时候,来了一位拥有VIP会员卡的朋友,插到了队伍的最前面
过了一会儿又来了一位拥有SVIP会员卡的朋友,插到了VIP的前面

虽然这个比喻可能不恰当,但是生活中可能存在有优先级的队列
优先级高的人可以查到优先级低的人前面

这就是循环队列

如果优先值小的元素放到队列的前面,这叫做最小优先队列
反之优先值大的元素放到队列的前面,这叫做最大优先队列
但其实他们两个仅仅是一个判断的改变,实现方式是一样的
优先队列较普通队列的区别也就是入队要判断优先级,并且需要对我们的元素进行处理,其他方法不变
这处理也就是把元素包装为一个拥有优先级的对象
既然所有对象都有着同样的属性,那我们毫无疑问就应该使用工厂构建
我们可以稍微修改一下我们的队列类
来实现一个最小优先队列

function PriorityQueue() {
  var items = [];
  function QueEle(ele, priority){ //封装我们的元素为一个对象
    this.ele = ele; //元素
    this.priority = priority; //优先级
  }
  this.enqueue = function (ele, priority) {
    var queObj = new QueEle(ele, priority); //创建队列元素对象
    if(this.isEmpty()){ //如果队列是空的,直接插入
      this.push(queObj);
    }else{
      var bAdded = false;
      for(var i = 0, len = items.length; i < len; i++){ 
        if(priority < items[i].priority){
          items.splice(i, 0, queObj); // 循环队列,如果优先级小于这个位置元素的优先级,插入
          bAdded = true;
          break;
        }
      }
      if(!bAdded){
        items.push(queObj); // 如果循环一圈都没有找到能插队的位置,直接插入队列尾部
      }
    }
  };
  this.dequeue = function () {
    return items.shift();
  };
  this.front = function () {
    return items[0];
  };
  this.isEmpty = function () {
    return items.length === 0;
  };
  this.size = function () {
    return items.length;
  };
  this.clear = function () {
    items = [];
  };
  this.print = function () {
    //这个地方稍微修改一下下
    var temp = [];
    for(var i = 0, len = items.length; i < len; i++){
      temp.push(items[i].ele);
    }
    console.log(temp.toString());
  };
}

解释我已经在代码里说的很明白
下面我们就用这个优先队列同样来模拟排队上WC

var pQueue = new PriorityQueue();
pQueue.enqueue('Mr.A', 3);
pQueue.enqueue('Mr.B', 3);
pQueue.enqueue('Mr.C', 3);
console.log("原队列:");
pQueue.print();
pQueue.enqueue('VIP', 2);
pQueue.enqueue('SVIP', 1);
console.log("新队列:");
pQueue.print();

控制台打印:

JavaScript队列、优先队列与循环队列

循环队列

循环队列典型的例子击鼓传花
还记得在我上高中的时候我们晚自习一停电就玩这个
拿一个东西当“花”,轮着传,“鼓”一停,拿到花的同学就要站起来唱歌
可以把循环队列当作是队列的应用
下面我们来模拟实现循环队列击鼓传花

function hotPotato(pepoleList, frequency){ //参数:表示人的数组,传花的频率
  var queue = new Queue();
  for(var i = 0, len = pepoleList.length; i < len; i++){
    queue.enqueue(pepoleList[i]); //初始化,进入队列
  }
  var eliminated;//被淘汰的同学
  while(queue.size() > 1){ //只要队列至少还有两个人,就一直循环
    for(var i = 0; i < frequency; i++){//出队入队,模拟循环效果
      queue.enqueue(queue.dequeue());
    }
    eliminated = queue.dequeue();//清算
    console.log(eliminated + '被淘汰');
  }
  return queue.dequeue();//返回队列中的最后一人
}
var pepole = ['Mr.A','Mr.B','Mr.C','Mr.D','Mr.E','Mr.F'];
var gameWinner = hotPotato(pepole, 12);
console.log('全场最佳:' + gameWinner);

控制台输出:

 JavaScript队列、优先队列与循环队列

以上就是JavaScript下的队列实现。
我们还简单理解了两个特殊的队列:优先队列与循环队列。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
浅谈Unicode与JavaScript的发展史
Jan 19 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
Jun 07 Javascript
Angular2使用Angular CLI快速搭建工程(一)
May 21 Javascript
官方推荐react-navigation的具体使用详解
May 08 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
May 29 Javascript
php中and 和 &amp;&amp;出坑指南
Jul 13 Javascript
关于单文件组件.vue的使用
Sep 20 Javascript
详解async/await 异步应用的常用场景
May 13 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
Apr 11 Javascript
JS实现横向跑马灯效果代码
Apr 20 Javascript
JQuery实现折叠式菜单的详细代码
Jun 03 jQuery
JavaScript中setTimeout的那些事儿
Nov 14 #Javascript
jquery css实现邮箱自动补全
Nov 14 #Javascript
JS常用算法实现代码
Nov 14 #Javascript
node.js缺少mysql模块运行报错的解决方法
Nov 13 #Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
Nov 13 #Javascript
JS实现的几个常用算法
Nov 12 #Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
Nov 12 #Javascript
You might like
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
使用js判断控件是否获得焦点
2014/01/03 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
vue-router路由懒加载及实现的3种方式
2021/02/28 Vue.js
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
python实现ipsec开权限实例
2014/11/11 Python
Python 12306抢火车票脚本
2018/02/07 Python
Python Logging 日志记录入门学习
2018/06/02 Python
pandas ix &amp;iloc &amp;loc的区别
2019/01/10 Python
django celery redis使用具体实践
2019/04/08 Python
Python 可变类型和不可变类型及引用过程解析
2019/09/27 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
实习生个人找工作的自我评价
2013/10/30 职场文书
电台实习生求职信
2014/02/25 职场文书
委托书英文
2015/01/28 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
敬老院活动感想
2015/08/07 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
JS 4个超级实用的小技巧 提升开发效率
2021/10/05 Javascript
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js