队列

队列是一种遵从先进先出(FIFO)的有序集合

生活中最常见的案例就是 排队

普通队列

  1. enqueue(element(s)):向队列尾部添加一个(或多个)新的项
  2. dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素
  3. front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。
  4. isEmpty():如果队列中不包含任何元素,返回true,否则返回false
  5. size():返回队列包含的元素个数,与数组的length属性类似
class Queue {
    constructor() {
        this.items = [];
    }
    enqueue(...args) {
        this.items.push(...args)
    }
    dequeue() {
        return this.items.shift();
    }
    front() {
        return this.items[0];
    }
    isEmpty() {
        return this.items.length === 0;
    }
    size() {
        return this.items.length;
    }
}

优先级队列

顾名思义:队列中的某项要优先处理

  1. 等舱和商务舱乘客的优先级要高于经济舱乘客
  2. 医生先处理病情严重的患者
  3. VIP 优先 普通人
  4. 等等......

实现方式:(这里我们实现第一种方式,感兴趣可自行实现第二种)

  1. 入队直接放,出队找最大(优先级最高)元素。
  2. 入队时排号队,出队按顺序出
class Queue {
    constructor() {
        this.items = [];
    }
    enqueue(value) {
        this.items.push(value);
    }
    dequeue() {
        let maxIndex = 0,     // 保存优先级最高
            index;
        this.items.forEach((v, i) => {
            if(v.zIndex > maxIndex) {
                maxIndex = v.zIndex;
                index = i;
            }
        })
        return this.items.splice(index, 1);
    }
    // ......
}

循环队列——击鼓传花

function hotPotato (nameList, num) {
    var queue = new Queue();    
    nameList.forEach(name => queue.enqueue(name));
    var eliminated = '';
    while (queue.size() > 1){
        for(let i = 0; i < num; i++) {
            queue.enqueue(queue.dequeue());  // 将第一项剪切到末尾
        }
        queue.dequeue();   // 删除第一项
    }
    return queue.items[0];
}
var names = ['Tom','Jack','Sally','Frank','Lucy'];
var winner = hotPotato(names, 7);
console.log('胜利者:' + winner);
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容