您现在的位置:首页 >> 前端 >> 内容

javascript数据结构与算法--队列

时间:2017/2/7 9:54:00 点击:

  核心提示:引言 队列是遵循先进先出(FIFO)的数据存储结构。当然js中的栈也是建立在array基础上的,对array不熟悉的伙伴可以看一下我写的关于array的博文Array1.队列的创建function Q...

引言

队列是遵循先进先出(FIFO)的数据存储结构。当然js中的栈也是建立在array基础上的,对array不熟悉的伙伴可以看一下我写的关于array的博文javascript基础–Array

1.队列的创建

function Queue(){
    var items = [];//存储队列内容
    //enqueue方法向队列尾部添加元素
    this.enqueue = function(element){
        items.push(element);
    };
    //dequeue方法移除队列首部元素
    this.dequeue = function(){
        return items.shift();
    };
    //front返回队列第一个元素,队列内容保持不变
    this.front = function(){
        return items[0];
    };
    //isEmpty判断队列内容是否为空
    this.isEmpty = function(){
        return items.length == 0;
    };
    //clear清除队列所有内容
    this.clear = function(){
        items = [];
    };
    //size返回队列内容长度
    this.size = function(){
        return items.length;
    };
    //print打印队列所有内容
    this.print = function(){
        console.log(items.toString());
    };
}

2.队列的使用

var queue = new Queue();
console.log(queue.isEmpty());//true
queue.enqueue("John");
queue.enqueue("Jack");
queue.enqueue("Camila");
queue.print();//["John","Jack","Camila"]
console.log(queue.size());//3
console.log(queue.isEmpty());//false
queue.dequeue();
queue.dequeue();
queue.print();//['Camila']

3.优先队列

什么是优先队列,举个例子,拍卖,谁给的钱越多就卖给谁,不管你什么时候来的,不管你有多想要,没钱就排在后面捡剩下的。这和优先队列逻辑一致,每个元素都有自己的优先级,优先级越高,就不管先来后到,有“钱”(优先级高)就是王道。我们可以在默认队列上入列操作上做文章,使队列元素按照优先级进行排列,然后按照传统的队列操作元素即可。上代码。

function PriorityQueue(){
    //priority越小,优先级越高
    var items = [];
    //构造元素,包含element和priority两个属性
    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);
                }
            }
        };
        //其他操作与默认队列Queue一致
    }
}

使用优先队列:

var priorityQueue = new PriorityQueue();
priorityQueue.enqueue("John",2);//['John']
priorityQueue.enqueue("Jack",1);//['Jack','John']
priorityQueue.enqueue("Camila",1);//['Jack','Camila','John']
priorityQueue.print();

4.循环队列

循环队列是什么?如果你把队列想象成一根管道,那么你把管道首尾相连便是循环队列了。循环队列的一个例子便是击鼓传花游戏,孩子们围成一个圈,开始传花,某一时刻停止,花在谁手里谁就被淘汰,直到剩下最后一名胜利者。上代码:

function resycleQueue(namelist, time){
    var queue = new Queue();
    //将游戏参与者姓名存入队列
    for(var i = 0;i < namelist.length;i++){
        queue.enqueue(namelist[i]);
    }
    var loser = '';
    while(queue.size()>1){
        for(var j = 0;j < time;j++){
            //将队列头部移除的元素插入队列尾部实现循环
            queue.enqueue(queue.dequeue());
        }
        //循环结束,移除淘汰者
        loser = queue.dequeue();
        consolo.log(loser+"被淘汰");
    }
    //队列元素只剩一个,返回最终胜利者
    return queue.dequeue();
} 
var names = ['A','B','C']
var winner = resycleQueue(names,10);
console.log('winner is' + winner);

结束语

将队列和生活中的示例结合起来学习,会加强自己的理解,队列,get!!!

Tags:10 06 6A AV 
作者:网络 来源:csdn_kingb