js数据结构——队列

一、

1.创建队列

function Queue(){
        var items = [];
        if(typeof this.enqueue != "function"){
            //进队
            Queue.prototype.enqueue = function(element){
                items.push(element);
            };
            //出队
            Queue.prototype.dequeue = function(){
                return items.shift();
            };
            //返回队列中的第一个元素
            Queue.prototype.front = function(){
                return items[0];
            };
            //判断是否空队
            Queue.prototype.isEmpty = function(){
                return items.length == 0;
            };
            //清空队列
            Queue.prototype.clear = function(){
                items = [];
            };
            //返回队列大小
            Queue.prototype.size = function(){
                return items.length;
            };
            //打印
            Queue.prototype.print = function(){
                console.log(items.toString());
            };
        }
    }

(1)上面代码利用数组和数组的push()和shift()方法实现进队和出队

2.使用队列 

var queue = new Queue();
    //入队并打印
    queue.enqueue(5);
    queue.enqueue(1);
    queue.enqueue(8);
    queue.enqueue(2);
    queue.enqueue(4);
    queue.print();              //5,1,8,2,4
    //返回第一个元素并打印
    console.log(queue.front()); //5
    queue.print();              //5,1,8,2,4
    //出队一个元素并打印,输出大小
    queue.dequeue();
    queue.print();              //1,8,2,4
    console.log(queue.size());  //4
    //清空队列并判空
    queue.clear();
    console.log(queue.isEmpty());//true

二、优先队列

1.创建优先队列

所谓优先队列,就是在元素添加和删除的时候是基于优先级的。

1.创建一个元素对象,有两个属性,元素值和元素优先级

2.入队,首先想到,最开始是空队,if(this.empty()),直接入队

3.如果不是空队,先设置找到插入位标记(flag = false),然后遍历已有队列中的元素,比较优先级大小,优先级数值小的(及优先级大的在前)

4.判断条件,如果元素的优先级数值大于队列中元素的优先级数值,进入下一次循环。

5。如果满足元素的优先级数值小于队列中元素的优先级数值,flag置为true,表示已经找到插入位,并用splice方法添加元素.

6.如果flag还是为flase,说明队列中所有元素的优先级数值都比要插入的数值小,所以直接入队就可以了

 function PriorityQueue(){
        var items = [];
        function QueueElement(element,priority){
            this.element = element;
            this.priority = priority;
        }
        if(typeof this.enqueue != "function"){
            //进队
            PriorityQueue.prototype.enqueue = function(element,priority){
                var queueElement = new QueueElement(element,priority);
                if(this.isEmpty()){
                    items.push(queueElement);
                }else{
                    var flag = false;
                    for(var i = 0;i < items.length;i++){
                        if(queueElement.priority < items[i].priority){
                            flag = true;
                            items.splice(i,0,queueElement);
                            break;
                        }
                    }
                    if(!flag){
                        items.push(queueElement)
                    }
                }
            };
            //出队
            PriorityQueue.prototype.dequeue = function(){
                return items.shift();
            };
            //返回队列中的第一个元素
            PriorityQueue.prototype.front = function(){
                return "->"+items[0].element+","+items[0].priority;
            };
            //判断是否空队
            PriorityQueue.prototype.isEmpty = function(){
                return items.length == 0;
            };
            //清空队列
            PriorityQueue.prototype.clear = function(){
                items = [];
            };
            //返回队列大小
            PriorityQueue.prototype.size = function(){
                return items.length;
            };
            //重写toString方法
            PriorityQueue.prototype.toString = function(){

            }
            //打印
            PriorityQueue.prototype.print = function(){
                for(var i = 0;i < items.length;i++){
                    console.log("("+items[i].element+","+items[i].priority+")");
                }
            };
        }
    }

(1)每次入队的是一个对象,根据priority属性排序,根据element属性取值。

 2.使用优先队列

var queue = new PriorityQueue();
    //入队并打印
    queue.enqueue(5,1);
    queue.enqueue(1,1);
    queue.enqueue(8,3);
    queue.enqueue(2,5);
    queue.enqueue(4,6);
    queue.print();              //(5,1),(1,1),(8,3),(2,5),(4,6)
    //返回第一个元素并打印
    console.log(queue.front()); //->5,1
    queue.print();              //(5,1),(1,1),(8,3),(2,5),(4,6)
    //出队一个元素并打印,输出大小
    queue.dequeue();
    queue.print();              //(1,1),(8,3),(2,5),(4,6)
    console.log(queue.size());  //4
    //清空队列并判空
    queue.clear();
    console.log(queue.isEmpty());//true

(2)值得注意的是,每一次进队一个元素时,前面的总是已经排好序的……。

三、循环队列 

通过将将出队元素进队实现循环队列

所以,循环队列可以基于普通队列实现

例:击鼓传花游戏

function whoWin(nameList,num){
        var queue = new Queue();
        //初始化队列
        for(var i = 0;i < nameList.length;i++){
            queue.enqueue(nameList[i])
        }
        //当队列的大小大于1的时候重复num次,把队首元素放到队尾,然后出队队首元素
        var pass = '';
        while(queue.size() > 1){
            for(var i = 0;i < num;i++) {
                queue.enqueue(queue.dequeue());
            }
            pass = queue.dequeue();
            console.log(pass+"在击鼓传花游戏中被淘汰");
        }
       return queue.front();
    }
    var names = ['wjj','wjw','wjy','wyc','wak','wp'];
    var winner = whoWin(names,7);
    console.log("胜利者:"+winner);

(1)上述代码要有“一”中的普通队列代码位基础

(2)如果直接在数组中遍历,很难获取他应该删除的位置,利用队列,每执行一次把元素放到队首,删除时,直接删除队首元素即可。

(3)两个循环条件,一个是queue.size()>0,保证剩余一个元素,另一个i<num,表示设定的循环次数

 

转载于:https://my.oschina.net/wyc1219/blog/829023

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值