JavaScript数据结构与算法 — 队列

目录

1、队列的定义

2、队列结构的实现

2.1、队列的常见方法队列常见的操作

2.2、代码实现

2.3、优先级队列

3、队列的应用

4、总结


1、队列的定义

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

(学习JavaScript数据结构与算法(第三版))

 

2、队列结构的实现

2.1、队列的常见方法队列常见的操作

  • enqueue(element) 向队列尾部添加一个(或多个)新的项。

  • dequeue() 移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。

  • front() 返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息与 Map 类的 peek 方法非常类似)。

  • isEmpty() 如果队列中不包含任何元素,返回 true,否则返回 false。

  • size() 返回队列包含的元素个数,与数组的 length 属性类似。

  • toString() 将队列中的内容,转成字符串形式。

2.2、代码实现

书上用的是对象来封装的队列,我这里用数组来封装,实现的逻辑的一样的

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

            //向队列尾部添加一个新的项
            enqueue(element) {
                this.items.push(element);
            };

            //移除队列的第一项,并返回被移除的元素
            dequeue() {
                if (this.items.length) {
                    return this.items.shift();
                };
            };

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

            //队伍中是否包含元素
            isEmpty() {
                return this.items.length === 0;
            };

            //返回队伍中的元素个数
            size() {
                return this.items.length;
            };

            //将队伍中的元素转换为字符串
            toString() {
                let str = '';
                for (let i = 0; i < this.items.length; i++) {
                    str += '' + this.items[i];
                }
                return str;
            };
        };

2.3、优先级队列

这里我只写了入队的方法,其余方法和上面类似

// 优先级队列中的每一项,每个项为一个对象,每个对象包含值和优先级
        class QueueElement {
            constructor(element, priority) {
                this.element = element; // 值
                this.priority = priority;//优先级
            };
        };
        class Queue {
            constructor() {
                this.item = [];
            };

            enqueue(element, priority) {
                // 设定为0为最大优先级,0、1、2、3...优先级以此递减
                let queueElement = new QueueElement(element, priority);
                let flag = 1;//比较优先级,最大记录为1,较小记录为0
                if (this.item.length == 0) {
                    // 如果队列为空直接入队
                    this.item.push(queueElement);
                } else {
                    for (let i = 0; i < this.item.length; i++) {
                        // 循环比较优先级
                        if (this.item[i].priority > queueElement.priority) {
                            this.item.splice(i, 0, queueElement);
                            flag = 0;
                            break;
                        };
                    };
                    if (flag == 1) {
                        this.item.push(queueElement);
                    };
                };
            };
        };

3、队列的应用

        // 击鼓传花
        let q = new Queue;
        let person = ['小花', '小李', '小丽', '张三', '李四', '王五'];
        let hotPotato = function (arr, n) {
            if (n === 0) return false;//不能传入0
            // 先循环添加数据
            for (let i = 0; i < arr.length; i++) {
                q.enqueue(arr[i]);
            };
            // 通过while循环控制整个击鼓传花流程,当只剩下一个人的时候停止循环
            while (q.items.length > 1) {
                for (let j = 0; j < n - 1; j++) {
                    q.enqueue(q.dequeue());
                };
                q.dequeue();
            };
            return q.items[0];
        };

4、总结

记录学习,当个笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值