【JavaScript】JS数据结构与算法之队列

本文深入探讨了前端工程师常忽视的数据结构——队列,遵循先进先出(FIFO)原则,通过ES5和ES6实现代码示例,帮助读者理解队列的基本操作如添加、删除及检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多前端工程师都是半路出家,对数据结构与算法一知半解,更甚者抱有“我是写页面的,会算法有什么用”类似心态。
刚好这段时间也在数据结构与算法 里遨游,所以,借此机会,跟大家共同探讨学习。

队列是什么

队列是一种遵循FIFO(first in first out ,先进先出)原则的一组有序的项(数组)。
这个定义的重点已经在上一句话中写出来了,先进先出 和有序。先进先出可以类比为排队买票,(正常情况下)先去买票的人,先出来。这就是队列。

Talk is Cheap , Show Me the Code!

在ES5下:

function Queue() {
    var items = [];
    //添加
    this.enqueue = function (el) {
        items.push(el);
    }
    //删除
    this.dequeue = function (el) {
        return items.shift();
    }
    //查看队列头元素
    this.front = function () {
        return items[0];
    }
    //检查是否为空
    this.isEmpty = function () {
        return items.length === 0;
    }
    //打印队列元素
    this.print = function () {
        console.log(items.toString());
    }
}

在ES6下:

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

let queue = new Queue();
queue.enqueue(3);
queue.enqueue(1);
queue.print();                       //3,1
console.log(queue.isEmpty());       //false
console.log(queue.size());          //2

简单说一下ES6创建私有属性items。

  • 原因
    我们希望Queue的使用只存在于各个方法之间,也就是说,只允许使用者使用类的方法,而不把变量暴露给使用者。
  • 做法
    1.使用ES6的限定作用域Symbol(缺点:可以用Object.getOwnPropertySymbols方法获取到)
    用法:
class Queue {
    constructor () {
        this[_items] = [];
    }
}

2.用WeakMap(键值对的形式)
用法:

const items = new WeakMap();
class Queue {
    constructor () {
        items.set(this,[]);
    }
}

但是,items此时实在class外部定义的,可以任意修改,因此,我们需要使用闭包把Queue类包起来,这样就只能在这个函数里访问WeakMap。

空闲时间再写后续的博吧!
挚谢阅读。

下一篇:【JavaScript】JS数据结构与算法之优先队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值