队列遵循FIFO(先进先出)原则的一组有序的项。队列在尾部添加新元素,在顶部移除元素,最新添加的元素必须在队列的尾部。
根据队列的定义,我们需要为队列创建一下几个方法:
- enqueue(elements): 向队尾添加一个或者多个元素;
- dequeue (): 移除队列最前面的元素,并返回被移除的元素;
- front () : 返回最先被添加的元素,只做查看用,不操作;
- isEmpty () : 判断当前对列是否为空,如果没有任何元素,返回true,否则返回false;
- size():返回队列包含的元素个数;
创建队列:
- 通过es6语法定义QUEUE类;
- 使用闭包封装QUEUE类;
- 使用WeakMap 设置私有属性;
let queue = (function() {
//使用WeakMap创建私有属性
let item = new WeakMap();
/**
* 队列
* @class QUEUE
* @constructor
* @method
*/
class QUEUE {
constructor() {
item.set(this, []);
}
enqueue(elements){
//如列,在队尾插入元素
let enqueue = item.get(this);
enqueue.push(elements);
}
dequeue() {
//出列,从队列最前面移除一位
let dequeue = item.get(this);
dequeue.shift();
}
isEmpty() {
//判断队列是否为空
let isEmpty = item.get(this);
return isEmpty.length === 0 ? true : false;
}
front() {
//返回队列中第一个元素
let front = item.get(this);
return front[0];
}
size() {
//返回队列的元素个数
let size = item.get(this);
return size.length;
}
print() {
let print = item.get(this);
console.log(print);
}
}
return QUEUE;
})()
但是在实际情况中,会有优先级的情况存在,我们不能每次都将元素放到最后,优先级高的,我们需要进行优先级排序
在 queue()中新创建一个类,用来生成队列每个元素的属性(新元素:elements,优先级:priority):
/**
* 优先队列设置属性
* @class QUEUEELEMENT
* @constructor
* @param {string} elements
* @param {number} priority
*/
class QUEUEELEMENT {
constructor(elements, priority = 3) {
this.elements = elements;
this.priority = priority;
}
}
修改enqueue方法:
enqueue(elements, priority) {
//如列,在队尾插入元素
let enqueue = item.get(this);
//实例化优先队列插入类
let queueelement = new QUEUEELEMENT(elements, priority);
//设置变量判断当前元素是否需要优先插入
let flag = false;
enqueue.forEach(function(item, index, arr) {
//越小优先级越高,如1>2
if (queueelement.priority < item.priority) {
//新元素优先级高,需要将新元素插入到当前元素前
enqueue.splice(index, 0, queueelement);
//更改状态
flag = true;
//跳出循环
console.log('跳出循环');
return;
};
});
//当新插入的元素优先级和已有的元素优先级相同或者更低时,直接将新元素插入到队尾
if (!flag) {
enqueue.push(queueelement);
};
this.print();
}
使用
let ss = new queue();
ss.enqueue('123');
ss.enqueue('123', 1);
ss.enqueue('123', 2);
结果如下
[ QUEUEELEMENT { elements: '123', priority: 1 },
QUEUEELEMENT { elements: '123', priority: 2 },
QUEUEELEMENT { elements: '123', priority: 3 } ]
我们发现,队列中插入的每个元素都具有一个elements,priority属性,根据优先级可以排序,在取队列中的某个元素时,需要选择elements才可以正确取出想要的元素,并且通过WeakMap的私有属性特征,将队列设置成只能在类内部作用域修改,无法再外部修改,更加安全。
``