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