简单说一说数据结构——队列

原创 2017年02月15日 20:42:38

上一次我们已经学习了栈。今天我们来说一说队列。

队列和栈非常类似,都是非常容易理解的数据结构。队列是遵循先来先服务原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。

在现实中,最常见的队列的例子就是排队:
这里写图片描述

排在前面的会先被服务,不管是什么服务。概念的东西非常简单,在这里就不再多说了。

接下来声明一些队列可用的方法:
enqueue(elements):向队列尾部添加一个或多个新的项。
dequeue():移除队列的第一项,并返回被移除的元素。
front():返回队列中的第一项,队列不做任何改动。注意与dequeue的区别。
isEmpty():如果队列中不包含任何元素,返回true,否则返回false。
size():返回队列中包含的元素个数。

实现代码:

function Queue(){
    var items = [];

    this.enqueue = function(element){
        items.push(element);
    }
    this.dequeue = function(){
        return items.shift();
    }
    this.front = function(){
        return items[0];
    }
    this.isEmpty = function(){
        return items.length === 0;
    }
    this.clear = function(){
        items = [];
    }
    this.size = function(){
        return items.length;
    }
    this.print = function(){
        console.log(items.toString());
    }
}

队列有两个修改版,其一是优先队列。元素的操作是基于优先级的。现实中也有这样的例子,比如机场登机的顺序。头等舱和商务舱的优先级是要高于经济舱的;又或者医院总是会看病情比较严重的患者。

如何实现呢?设置优先级。

function PriorityQueue(){
    var items = [];
    function QueueElement(element , priority){            //声明一个包含元素和优先级的构造函数
        this.element = element;
        this.priority = priority;
    }
    this.enqueue = function(element , priority){
        var queueElement = new QueueElement(element , priority);
        if(this.isEmpty()){                               //如果为空,直接入列
            items.push(queueElement);
        }else{
            var added = false;
            for(var i = 0 ; i < items.length ; i++){
                if(queueElement.priority < items[i].priority){      //插在优先级比自己大的元素的前面
                    items.splice(i,0,queueElement);
                    added = true;
                    break;
                }
                if(!added){                                   //如果没有优先级比自己大的元素,直接插入队尾
                    items.push(queueElement);
                }
            }
        }
    }
}

其二是循环队列,现实生活中的例子有击鼓传花的游戏。在这个游戏中,孩子们围成一个圆圈,把花尽快地传递到旁边的人。某一时刻鼓声停止,就停止传递。花在谁手上,谁就退出圆圈游戏。直到只剩下一个孩子。实现起来也是比较简单的:

function hotPotato(nameList , num){
    var queue = new Queue();
    for(var i = 0 ; i < nameList.length ; i++){       //把全部人加入到队列中
        queue.enqueue(nameList[i]);
    }

    var eliminated = '';
    while(queue.size() > 1){
        for(var i = 0 ; i < num ; i++){                  //循环
            queue.enqueue(queue.dequeue());
        }
        eliminated = queue.dequeue();                  //到达传递次数,淘汰
        console.log(eliminated + '被淘汰');
    }
    return queue.dequeue();                             //最后一个胜利者
}

可以看到,不管是优先队列还是循环队列,都是基于Queue这个构造函数的。测试代码请移步到队列

OK,队列就讲到这里了。有什么问题欢迎留言,共同讨论,共同成长!

下一节聊稍微复杂的链表!但我还是要简单说。

版权声明:本文为博主原创文章,未经博主允许不得转载。

简单说一说数据结构——栈

数组是Javascript里面非常灵活的数据结构,如何用数组来构建栈?栈是一种遵从后进先出(LIFO)的有序集合。新添加的或删除的元素都保存在栈的末尾,称为栈顶,另一端就叫栈底。在栈里,新元素都靠近栈...

简单说一说数据结构——集合

迄今为止,我们已经学习了数组(列表)、栈、队列和链表(及其变种)等顺序数据结构。这一节我们讲讲集合。集合的定义是由一组无序且唯一(即不能重复)的项组成的。不包含任何元素的集合就叫做空集。上高中那会,我...

简单说一说数据结构——链表

数组是一种非常简单的存储数据序列的数据结构。平时开发中,要存储多个元素,数组是最常用的数据结构。但是,在大多数语言中,数组的大小是固定的。从数组的起点或中间插入或移除项的成本非常高,因为需要频繁地移动...

说一说用户体验的主导性(微拍)——一款微信产品

最近微信公共平台很火,我们公司也在做微信公共平台开发。我由于编程技术不行,我被安排在了测试岗位上。公司和另外一家公司合作,做了一款微拍的应用,主要功能有三点: 1、  有一段商家视频,在机器上循环播...

简单说一说排序算法

作为一名合格的程序员,还是要懂一些排序算法。学习这个话题,通常都会先学冒泡排序,因为它在所有的排序算法中是最简单也是最**的。当然,简单是不会有好结果的。它的性能也是最差的。冒泡排序通过比较任何两个相...

(hdu step 8.1.6)士兵队列训练问题(数据结构,简单模拟——第一次每2个去掉1个,第二次每3个去掉1个.知道队伍中的人数<=3,输出剩下的人 )

题目:士兵队列训练问题Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub...

带说一说新版全景通

  • 2016年12月20日 12:54
  • 14.78MB
  • 下载

OC 说一说IOS里的截屏方法

第一种 这是IOS3时代开始就被使用的方法,废止与IOS7。IOS私有方法,效率很赞。 #import extern "C" CGImageRef UIGetScreenImage(); UIIm...

数据结构——栈和队列

  • 2015年09月03日 12:32
  • 670KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单说一说数据结构——队列
举报原因:
原因补充:

(最多只允许输入30个字)