用Javascript实现队列

github主页:https://github.com/A15162252289

什么是队列

队列是遵循FIFO(First In First Out)原则的一组有序的项。队列在尾部添加新元素,从顶部移除元素。最新添加的元素必须排在队列的末尾。
在计算机科学中,一个常见的例子就是打印队列。比如说,我们需要打印五份文档。我们会打开每个文档,然后点击打印按钮。每个文档都会被发送到打印队列。第一个发送到打印队列的会优先被打印,一次类推,直至打印完所有文档。

怎样实现队列

  1. 使用构造函数实现队列
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; //查看队列的长度
    };
}

实例化:

let queue = new Queue();
queue.isEmpty(); //true
queue.enqueue(2); //添加元素2
queue.size(); //1
queue.dequeue(); //返回元素2

2.使用**ES6**类实现队列
let Queue2 = (function () {
    const items = new WeakMap();
    class Queue2 {
        constructor () {
            items.set(this, []);
        }
        enqueue (element) {
            let q = items.get(this);
            q.push(element); //向队列底部添加元素
        }
        dequeue () {
            let q = items.get(this);
            let t = q.shift();
            return t; //移除顶部的一个元素并返回该元素
        }
        front () {
            let q = items.get(this);
            return q[0]; //仅返回顶部的第一个元素
        }
        isEmpty () {
            let q = items.get(this);
            return q.length === 0; //判断队列是否为空
        }
        size () {
            let q = items.get(this);
            return q.length; //查看队列的长度
        }
    }
    return Queue2;
})();

3.优先队列的实现:
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); //创建元素对象
        let added = false;
        items.forEach((item, index) => {
            if (queueElement.priority < item.priority) {
                items.splice(index, 0, queueElement);
                added = true;
                return false;
            }
        }); //遍历整个队列,找出优先级比queueElement低的元素,并把queueElement插在该元素前面,终止遍历
        if (!added) {
            items.push(priority);
        }
    };
    //其他方法
}

4.循环队列的实现:
//循环队列----击鼓传花
function hotPotato (nameList, num) {
    if (!(nameList instanceof Array)) {
        throw new Error('请第一个参数应为数组nameList');
    }
    if (typeof num !== 'number') {
        throw new Error('第二个参数应为数字');
    }
    let queue = new Queue(); //初始化队列
    nameList.forEach(item => {
        queue.enqueue(item);
    });
    let eliminated = ''; //初始化被淘汰的人
    while (queue.size() > 1) {
        for (let i = 0; i < num; i++) {
            queue.enqueue(queue.dequeue());
        }
        eliminated = queue.dequeue(); //每轮被淘汰的人
        console.log(eliminated + ' is out');
    }
    let winner = queue.dequeue();
    console.log('winner is ' + winner);
}

实例化:

let nameList = [1, 2, 3, 4, 5, 6, 7];
let num = 5;
hotPotato(nameList, num);
// 输出如下:
// 6 is out
// 5 is out
// 7 is out
// 2 is out
// 1 is out
// 4 is out
// winner is 3

Github源代码:link.

你可能感兴趣的:(用Javascript实现队列)