js实现队列及ES6优化

ES5

let items = [];
function Queue() {
    //队列添加元素
    this.enqueue = function (element) {
        items.push(element);
    }
    //队列移除元素
    this.dequeue = function () {
        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());
    }
}

ES6的WeakMap和闭包

let Queue = (function () {
    const items = new WeakMap();
    class Queue {
        constructor() {
            items.set(this, []);
        }
        enqueue(element) {
            let q = items.get(this);
            q.push(element);
        }
        dequeue() {
            let q = items.get(this);
            let r = q.shift();
            return r;
        }
        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;
        }
        print() {
            let q = items.get(this);
            console.log(q.toString());
        }
    }
    return Queue;
})()

测试数据:

let queue = new Queue();
console.log(queue.isEmpty());
queue.enqueue("Json");
queue.enqueue("js");
console.log(queue.size());
console.log(queue.isEmpty());
queue.dequeue();
queue.print();

优先队列---最小优先

function PriorityQueue() {
    let items = [];
    function QueueElement(element, priority) {
        this.element = element;
        this.priority = priority;
    }
    this.queue = function (element, priority) {
        let queueElement = new QueueElement(element, priority);
        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.front = function () {
        return items[0];
    }
    this.isEmpty = function () {
        return items.length === 0;
    }
    this.size = function () {
        return items.length;
    }
    //$
    this.print = function () {
        for (let i = 0; i < items.length; i++) {
            console.log(`${items[i].element}-${items[i].priority}`);
        }
    }
}

let priorityQueue = new PriorityQueue();
priorityQueue.enqueue("JSON", 2);
priorityQueue.enqueue("JS", 1);
priorityQueue.enqueue("CSS", 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 j = 0; j < num; j++) {
            queue.enqueue(queue.dequeue()); //循环
        }
        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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wcc_Learning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值