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

  • 时间:
  • 浏览:0
  • 来源:大发时时彩官网_大发时时彩邀请码_大发时时彩娱乐平台

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

  亲们在前一篇文章中描述了何如用JavaScript来实现栈这个 数据特性,这里亲们对应地来实现队列。

function Queue() {
    let items = [];

    // 向队列上加元素(有三个

或多个)
    this.enqueue = function (element) {
        if (element instanceof Array) items = items.concat(element);
        else 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;
    };

    // 清空队列
    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()函数连接有三个 数组,因此参数完整性也有数组,则直接用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;
})();

  这有三个 版本的执行结果是一样的,它们的区别亲们在前一篇文章中因此提及过了,这里不再赘述。

优先队列

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

function PriorityQueue() {
    let items = [];

    // 向队列上加元素(有三个

或多个)
    // 参数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();
    };

    // 返回队列中的第有三个

元素
    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格式,以保证队列中的每有三个 元素完整性也有有三个 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的优先级比其它有三个 低,统统它被排在了最顶端。着实Jack和Camila的优先级相同,因此Jack是在Camila可是先插入到队列中的,统统Jack排在了Camila可是,这也符合了亲们的预期。

循环队列

   亲们用有三个 小游戏“击鼓传花”来说明循环队列在实际中的应用。

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}`);

  在这个 游戏中,亲们传入由三个 名字组成的数组,用来表示参加游戏的五被委托人,数字7表示每一轮要传递的次数。在每有三个 过程中,亲们从队列头部取出有三个 元素加到队列的尾部,当次数用完的可是,将队列头部的元素取出来,作为这个 轮中被淘汰的人。让亲们来看一下具体的执行过程,一开始队列中的顺序是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。反复执行上述过程,直到队列中的元素只剩有三个 ,这个 我希望最后的赢家!

  下面是完整性的执行结果:

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

   下一章亲们继续来看看何如用JavaScript来实现链表。

猜你喜欢

「電話門」延燒 美眾院啟彈劾總統調查

圖:美國總統特朗普資料圖片【大公報訊】綜合BBC、CNN、《華盛頓郵報》報道:美國總統特朗普7月底與烏克蘭總統澤連斯基通電話時,涉嫌施壓令其調查美國前副總統拜登父子的「電話門」

2020-01-23

字节跳动推出“啄木鸟举报平台”小程序 可举报旗下产品违规内容

站长之家(ChinaZ.com)6月18日消息:昨日,字节跳动官方发表声明推出“啄木鸟举报平台”小应用线程,据介绍,“啄木鸟举报平台”将能够为用户提供字节跳动系产品内存在的疑似

2020-01-23

Windows 10新版17074发布:免打扰功能加入

北京时间1月12日,微软面向Windows10快速会员推送了Build17074预览版更新,这是进入2018年以来,RedStone4的第一次大的版本迭代。更新内容如下——Ed

2020-01-23

F. Vyhnalek数据,F. Vyhnalek新闻,F. Vyhnalek视频,F. Vyhnalek身价

首页新闻视频直播数据APP懂球号直播君广告企业商务合作F.VyhnalekF.Vyhnalek俱乐部:霍恩国籍:奥地利身高:CM位置:中场年龄:体重:KG号码:17号生日:惯用

2020-01-23

手游上线送满v百万元宝免费下载

手游上线送满v百万元宝是一款最新好玩的游戏软件平台,由创游科技倾力打造的游戏下载应用平台,在这里愿意到最新、最火爆的BT游戏,但会 上线即送满VIP、免费0元GM特权服,豪华

2020-01-23