02Javascript数据结构与算法 之 队列

180 阅读2分钟

1. 定义

队列遵循先进先出(FIFO)的原则的一组有序的项。队列在尾部添加新元素,并在顶部移除元素。最新添加的元素必须排在队列的末尾。


2. 队列实例

我们使用数组来存储数据,然后再为它编写一些特性的方法:

  • enqueue(elements): 向队列尾部添加一个(或多个)新的项
  • dequeue(): 移除队列中的第一项,并返回被移除的元素
  • front(): 返回队列中中的第一个元素(最先被添加的),队列不做任何改动
  • isEmpty(): 如果队列中不包含任何元素,返回true,否则返回false
  • size(): 返回队列个数
function Queue() {
    var items = [];
    this.enqueue = (item) => {
        if (typeof item === 'number') {
            items.push(item);
        } else {
            items.push(...item);
        }
    };
    this.dequeue = () => (items.shift());
    this.front = () => (items[0]);
    this.isEmpty = () => (items.length === 0);
    this.clear = () => (items = []);
    this.size = () => (items.length);
}

let queue = new Queue();
queue.enqueue([1,2,3]);
console.log(queue.dequeue());
console.log(queue.size());
console.log(queue.isEmpty());
console.log(queue.clear());
console.log(queue.size(), queue.isEmpty());

Queue类和Stack类非常类似。唯一的区别是dequeue方法和front方法,这是由于先进先出和后进先出原则的不同所造成的。

3. 优先队列

优先队列条件要求如下:

  • 同等优先级,维持先进先出
  • 不同优先级,1=>6 (或更大), 数字越小,优先级越高 => 不管谁先进,在出队列时,数字越小更先出
function Queue() {
    let items = [];
    
    // 一个包含优先级和值的item类
    function QueueElement(element, priority) {
        this.element = element;
        this.priority = priority; 
    }

    this.enqueue = (element, priority) => {
        var queueElement = new QueueElement(element, priority);
        if (!this.isEmpty()) {
            items.push(queueElement);
        } else {
            let add = false;
            for (let i = 0; i < items.length; i++) {
                if (priority < items[i].priority) {
                    add = true;
                    items.splice(i, 0, queueElement);
                    break;
                }
            }
            // add 为false,代表items中的优先级都优先于element
            if (!add) {
                items.push(queueElement)
            }
        }
    };
}

3. 循环队列(丢手绢游戏)

一群人围成一个圈, 手绢丢到谁的背后谁就淘汰。那么利用队列实现如下:

  • 存放队列初始化数据(7个人)
  • 经过某个人后面,将该人移除队列,并放到队列的最后,达到循环的作用
  • 丢到某一个人后面,移除队列


function PlayGames() {

    // 利用队列来存储数据
    let queue = new Queue();

    // 初始化数据
    this.setPeople = (people) => (queue.enqueue(people));

    // 每次移除的对象
    this.remove = (removeIndex) => {
        while(queue.size() > 0) {
            for ( let i = 0; i < removeIndex; i++) {
            queue.enqueue(queue.dequeue());
            }
            let eliminated = queue.dequeue();
            console.log(`${eliminated} 被移除了!`, queue.size());
        }
    };
}

var p = new PlayGames();
p.setPeople([1,2,3,4]);
p.remove(7);