(三)学习数据结构与算法——队列

回顾知识,才能继续深入!

队列也是一种重要的数据结构,看起来比较简单,这里做个笔记,方便自己之后回顾~

  • 队列的特点:先进先出
  • 实例:生活中排队的例子
  • 实现方法:

1)创建队列

function Queue(){
    let items=[];//存放元素
}

2)队列的方法:

增:enqueue(element(s)),向队列尾部添加一个或多个元素

删:dequeue(),移除队列的第一个元素,并返回被移除的值

查:front(),返回第一个元素

        isEmpty(),查看队列是否为空

        size(),返回队列包含的元素个数

3)具体实现方法:

enqueue(element(s)),向队列中添加元素

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;
}

size(),查看队列的元素个数

this.size=function(){
    return items.length;
}

打印队列元素

this.print=function(){
    console.log(items.toString());
}

完整代码和测试: 

    function Queue(){
        let 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.size=function(){
            return items.length;
        };
        this.print=function(){
            console.log(items.toString());
        }
    }
    let queue=new Queue();
    console.log(queue.isEmpty());
    queue.enqueue("John");
    queue.enqueue("Jack");
    queue.print();
    console.log(queue.size());
    console.log(queue.isEmpty());
    queue.dequeue();
    queue.print();

4)队列的修改

  • 优先队列

通过设置优先级:

 function PriorityQueue(){
        let items=[];
        function QueueElement(element,priority){
            this.element=element;
            this.priority=priority;
        }
        this.enqueue=function(element,priority){
            let queueElement=new QueueElement(element,priority);
            //注意这added的控制
            let added=false;
            for(let 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);
            }
        };
        this.print=function(){
            for(let i=0;i<items.length;i++){
                console.log(`${items[i].element}-${items[i].priority}`);
            }
        };
        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;
        };
    }
    let priorityQueue=new PriorityQueue();
    priorityQueue.enqueue("John",2);
    priorityQueue.enqueue("Jack",1);
    priorityQueue.enqueue("Camila",1);
    priorityQueue.print();
  • 循环队列

例子:击鼓传花

    function hotPotato(nameList,num){
        let queue=new Queue();
        for(let i=0;i<nameList.length;i++){
            queue.enqueue(nameList[i]);//全部人入列
        }
        let eliminated='';
        while(queue.size()>1){
            for(let i=0;i<num;i++){
                queue.enqueue(queue.dequeue());//击鼓传花的实现,就是将队列的头移到队列的尾,直到size=1
            }
            eliminated=queue.dequeue();
            console.log(eliminated+'在击鼓传花游戏中被淘汰');
        }
        return queue.dequeue();
    }
    let names=['John','Jack','Camila','Ingrid','Carl'];
    let winner=hotPotato(names,7);
    console.log('The winner is '+winner);

以上例子均来自《学习javascript数据结构与算法》书籍

真的很佩服本书的作者!!!

猜你喜欢

转载自blog.csdn.net/tozeroblog/article/details/82749349