JavaScript数据结构——队列的实现与应用

  • 时间:
  • 浏览:1
  • 来源:大发pk10_pk10遗漏_大发pk10遗漏

  队列与栈不同,它遵从先进先出(FIFO——First In First Out)原则,新加上的元素排在队列的尾部,元素可不可不都还可以 了从队列头部移除。

  大家在前一篇文章中描述了怎么才能 才能 用JavaScript来实现栈五种 数据型态,这里大家对应地来实现队列。

function Queue() {
    let items = [];

    // 向队列加上元素(一另5个或多个)
    this.enqueue = function (element) {
        if (element instanceof Array) items = items.concat(element);
        else items.push(element);
    };

    // 从队列移除元素
    this.dequeue = function () {
        return items.shift();
    };

    // 返回队列中的第一另5个元素
    this.front = function () {
        return items[0];
    };

    // 判断队列是是不是为空
    this.isEmpty = function () {
        return items.length === 0;
    };

    // 返回队列的长度
    this.size = function () {
        return items.length;
    };

    // 清空队列
    this.clear = function () {
        items = [];
    };

    // 打印队列内的所有元素
    this.print = function () {
        console.log(items.toString());
    };
}

  与栈的实现最好的妙招类式,唯一不同的是从队列移除元素时取的是队列头部的元素(最先加上的),而栈则是取的顶部元素(最后加上的)。下面是许多测试用例及返回结果:

let queue = new Queue();
console.log(queue.isEmpty()); // true

queue.enqueue('John');
queue.enqueue(['Jack', 'Camila']);
queue.print(); // John,Jack,Camila
console.log(queue.size()); // 3
console.log(queue.isEmpty()); // false
console.log(queue.front()); // John

console.log(queue.dequeue()); // John
queue.print(); // Jack,Camila

queue.clear();
queue.print(); // 

  注意,大家允许批量向队列中加上元素,为此大家可不可不都还可以 判断enqueue最好的妙招的参数类型,肯能参数是数组,则用concat()函数连接一另5个数组,肯能参数也有 数组,则直接用push()函数将元素加上到队列中。

  与栈的实现最好的妙招一样,这里大家也同样给出用ES6的WeakMap类来实现的队列版本。

let Queue = (function () {
    const items = new WeakMap();

    class Queue {
        constructor() {
            items.set(this, []);
        }

        enqueue (element) {
            let q = items.get(this);
            if (element instanceof Array) items.set(this, q.concat(element));
            else q.push(element);
        };

        dequeue () {
            let q = items.get(this);
            return q.shift();
        };

        front () {
            return items.get(this)[0];
        };

        isEmpty () {
            return items.get(this).length === 0;
        };

        size () {
            return items.get(this).length;
        };

        clear () {
            items.set(this, []);
        };

        print () {
            console.log(items.get(this).toString());
        };
    }

    return Queue;
})();

  五种 另5个版本的执行结果是一样的,它们的区别大家在前一篇文章中肯能提及过了,这里不再赘述。

优先队列

  所谓优先队列,顾名思义,就说 说插入到队列中的元素都可不可不都还可以 根据优先级设置先后顺序。优先级越高位置越靠前,优先级越低位置越靠后。假设优先级用数字来表示,肯能数字越小表示的优先级越高,形成的队列就称之为最小优先队列,反之则称之为最大优先队列。下面是实现的代码:

function PriorityQueue() {
    let items = [];

    // 向队列加上元素(一另5个或多个)
    // 参数obj的数据格式:{element, priority}
    this.enqueue = function (obj) {
        if (obj instanceof Array) {
            for (let i = 0, ci; ci = obj[i]; i++) {
                this.enqueue(ci);
            }
        }
        else {
            let added = false;
            for (let i = 0, ci; ci = items[i]; i++) {
                // 最小优先级,即将priority值小的元素插入到队列的前面
                if (obj.priority < ci.priority) {
                    items.splice(i, 0, obj);
                    added = true;
                    break;
                }
            }

            // 肯能元素没办法

插入到队列中,则默认加到队列的尾部
            if (!added) items.push(obj);
        }
    };

    // 从队列移除元素
    this.dequeue = function () {
        return items.shift();
    };

    // 返回队列中的第一另5个元素
    this.front = function () {
        return items[0];
    };

    // 判断队列是是不是为空
    this.isEmpty = function () {
        return items.length === 0;
    };

    // 返回队列的长度
    this.size = function () {
        return items.length;
    };

    // 清空队列
    this.clear = function () {
        items = [];
    };

    // 打印队列内的所有元素
    this.print = function () {
        items.forEach(function (item) {
            console.log(`${item.element} - ${item.priority}`);
        });
    };
}

  都可不可不都还可以 看到,唯一有区别的可不可不都还可以 了enqueue最好的妙招。大家规定所有加上到优先队列的元素都可不可不都还可以 满足{element, priority}五种 JSON格式,以保证队列中的每一另5个元素也有 一另5个priority属性来表示优先级。肯能要加上的元素的优先级和队列中已有元素的优先级相同,仍然遵循队列的先进先出原则。肯能队列中所有元素的优先级比要加上的元素的优先级都高,则将元素加上到队列的末尾。大家将print()最好的妙招也做了许多调整,以方便查看输出结果。

let queue = new PriorityQueue();
console.log(queue.isEmpty()); // true

queue.enqueue({element: 'John', priority: 2});
queue.enqueue([{element: 'Jack', priority: 1}, {element: 'Camila', priority: 1}]);
queue.print(); // Jack,Camila,John

  肯能John的优先级比其它一另5个低,很多它被排在了最里边。虽然Jack和Camila的优先级相同,然后Jack是在Camila事先 先插入到队列中的,很多Jack排在了Camila事先 ,这也符合了大家的预期。

循环队列

   大家用一另5个小游戏“击鼓传花”来说明循环队列在实际中的应用。

function hotPotato(nameList, num) {
    let queue = new Queue();

    for (let i = 0, ci; ci = nameList[i]; i++) {
        queue.enqueue(ci);
    }

    let eliminated = '';
    while(queue.size() > 1) {
        for (let i = 0; i < num; i ++) {
            queue.enqueue(queue.dequeue());
        }
        eliminated = queue.dequeue();
        console.log(`${eliminated} has been eliminated.`);
    }

    return queue.dequeue();
}

let names = ['John', 'Jack', 'Camila', 'Ingrid', "Carl"];
let winner = hotPotato(names, 7);
console.log(`The winner is: ${winner}`);

  在五种 游戏中,大家传入由5个名字组成的数组,用来表示参加游戏的五我人个,数字7表示每一轮要传递的次数。在每一另5个过程中,大家从队列头部取出一另5个元素加到队列的尾部,当次数用完的事先 ,将队列头部的元素取出来,作为五种 轮中被淘汰的人。让大家来看一下具体的执行过程,一结速英文英语 队列中的顺序是John, Jack, Camila, Ingrid, Carl,然后传递7次:

  1. Jack, Camila, Ingrid, Carl, John

  2. Camila, Ingrid, Carl, John, Jack

  3. Ingrid, Carl, John, Jack, Camila

  4. Carl, John, Jack, Camila, Ingrid

  5. John, Jack, Camila, Ingrid, Carl

  6. Jack, Camila, Ingrid, Carl, John

  7. Camila, Ingrid, Carl, John, Jack

  事先 从队列中取出的是Camila。反复执行上述过程,直到队列中的元素只剩一另5个,五种 就说 最后的赢家!

  下面是完正的执行结果:

Camila has been eliminated.
Jack has been eliminated.
Carl has been eliminated.
Ingrid has been eliminated.
The winner is: John

   下一章大家继续来看看怎么才能 才能 用JavaScript来实现链表。

猜你喜欢

小米 5X 全网通 4GB+64GB 玫瑰金 移动联通电信4G手机 双卡双待好不好,优缺点,是否值得买

2018-01-2022:49:55j***假1分12月26日买的!今天是1月20号还没来的晒单就坏了。总爱重启为什么会么会让总爱黑屏,亲戚亲戚一帮人可不时要看视频,太不靠谱了

2020-01-26

迪士尼2019年大爆发:复联4等多部电影受网友期待

IT之家12月31日消息据外媒报道,日前美国最大的售票网站之一Fandango展开了2019年最受期待大片调查,根据网友视频视频视频 投票,漫威《复仇者联盟4:终局之战》成为

2020-01-26

王者荣耀体验服怎么参加 体验服参加方式

更新时间:2017-06-2307:20:51来源:斗蟹游戏编辑:斗蟹王者荣耀体验服参加土最好的办法由斗蟹网小编为我们带来。王者荣耀体验服为什在么在参加?王者荣耀体验服哪里报名

2020-01-26

小米 4 16GB 电信版4G手机(白色)好不好,优缺点,是否值得买

关于亲戚亲戚朋友儿|广告服务|使用条款|联系亲戚亲戚朋友儿北京盛拓优讯信息技术有限公司.版权所有中华人民共和国增值电信业务经营许可证编号:京B2-20170206北京市公安局海

2020-01-26

通过Blazor使用C#开发SPA单页面应用程序(1)

通过Blazor使用C#开发SPA单页面应用守护进程池池(1)-简介及特点通过Blazor使用C#开发SPA单页面应用守护进程池池(2)-开发环境通过Blazor使用C#开发S

2020-01-26