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

来源:互联网 发布:软件封装 可视化代码 编辑:程序博客网 时间:2024/06/05 10:34

引言

队列是遵循先进先出(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());//truequeue.enqueue("John");queue.enqueue("Jack");queue.enqueue("Camila");queue.print();//["John","Jack","Camila"]console.log(queue.size());//3console.log(queue.isEmpty());//falsequeue.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!!!

0 0