JS数据结构和算法 --- 队列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_JavaScript/article/details/84557544

概念:只允许在表的前端(front)进行删除操作,在表的后端(rear)进行插入操作的一种特殊线性表

核心思想:先进先出

分类:1)循环队列:普通队列的首尾相接形成圆环,这样的队列称为循环队列(Circular Queue)

           2)优先队列:普通队列的元素被赋予了优先级,具有最高优先级的元素最先删除,这样的队列称为优先队列(Priority Queue)

操作方法:1)enqueue() 入列,即元素插入队列

                  2)dequeue() 出列,即从队列删除元素

                  3)front() 查找队列头

                  4)isEmpty() 判断队列是否为空

                  5)size() 队列大小

应用场景:适用于多任务同步进行操作的场景,根据优先权选择优先级高的优先处理。

队列的理解:把队列比作是一个排队的过程,机场里检票登机的时候,谁先排队的谁就优先检票(先进先出),但是有某些人是VIP会员,可以走VIP通道会比大部分人都优先登机(优先队列)。

实例

1、队列的操作方法

/* 定义一个队列类 */
function Queue(){
    /* 一个队列 */
    let arr = [];
    /* 查询队列 */
    this.getQueue = ()=>{
        return arr;
    },
    /* 入列 */       
    this.enqueue = (element)=>{
        arr.push(element);
    },
    /* 出列 */
    this.dequeue = ()=>{
        return arr.shift();
    },
    /* 查看队列头 */
    this.front = ()=>{
        return arr[0]   
    },
    /* 判断队列是否为空 */
    this.isEmpty = ()=>{
        return arr.length == 0;
    },
    /* 查询队列大小(即数组长度) */
    this.size = ()=>{
        return arr.length;
    }
    
}

2、循环队列,破解击鼓传花的游戏

/* 
击鼓传花的游戏:
一群人围城一圈,一朵花从某个人开始顺时针依次传递,第三次传递拿到花者出局,从下一位又重新开始,已旧是第三次传递拿到花者出局,游戏以这规则进行下去,直到只剩下一个人,即为最终胜利者 
*/
/*
循环队列方法解决问题:
用一个数组代表一圈人,第一次传花把数组第一项拿出插入到数组尾,第二次传花(在第一次基础上)又把数组的第一项拿出插入到数组尾,第三次(在第二次基础上)删除第一项(出局),依次进行下去,直到数组只剩下一项
*/
function PassTheParcel(people){
    let q = new Queue();           // 调用队列的操作方法
    for(item of people){           
        q.enqueue(item);           //元素一个个入栈
    }
    while(q.size()>1){
        for(let i=0; i<2; i++ ){      //第一次和第二次传花
            q.enqueue(q.dequeue());        //拿出第一项插入尾部
        }
        q.dequeue();        //第三次出局     
    }
    return '最终胜利者' + q.getQueue();
}

3、优先队列,根据优先级插入队列

/* 定义一个优先队列类 */
function PriorityQueue(){
    // 优先队列数组
    let items = [];
    // 定义一个辅助类(用于创建一项具有优先级的元素)
    function AuxiliaryClass(element,priority){
        this.element = element;         // 元素名称
        this.priority = priority;       // 优先级标识
    }
    // 优先队列元素入列的方法
    this.enqueue = (element,priority)=>{
        let queueItem = new AuxiliaryClass(element,priority);       // 调用辅助类创建一个元素
        let added = false;
        for(let i=0,len=items.length; i<len; i++){      
            if(queueItem.priority > items[i].priority){     // 与每一项做比较,若优先级比较高,则插入其前面,结束比较
                items.splice(i,0,queueItem);
                added = true;
                break;
            }
        }
        if(!added){             // 比队列的所有项都小,则插入尾部
            items.push(queueItem);
        }
    };
    this.getPriorityQueue = ()=>{
        return items;
    };
}

(完)

猜你喜欢

转载自blog.csdn.net/Mr_JavaScript/article/details/84557544