像栈一样,队列也是一种线性表。它允许在表的一端插入数据,在另一端删除元素。插入元素的这一端称之为队尾。删除元素的这一端我们称之为队首。队列的结构如下图所示。
队列的特性:
- 在队尾插入元素,在队首删除元素。
- FIFO(先进先出),和食堂排队打饭一样。
es5 实现
function Queue(){
var temps = [];
//队列的插入
this.insert = function(e){
if(e){
temps.push(e);
}
}
//队列的删除
this.remove = function(){
return temps.shift();
}
//获取队列的长度
this.getSize = function(){
return temps.length;
}
//清除队列
this.clear = function(){
temps = [];
}
//获取队列的第一个元素
this.getFront = function(){
if(temps.length>0){
return temps[0]
}else{
return null;
}
}
//判断队列是否为空
this.isEmpty = function(){
return temps.length == 0;
}
// 打印队列内的所有元素
this.print = function () {
console.log(temps.toString());
};
}
测试:
//====================================测试=============================
let queue = new Queue();
console.log(queue.isEmpty()); // true
console.log("向队列插入数据:郭,张,刘");
//向队列插入数据
queue.insert('郭');
queue.insert('张');
queue.insert('刘');
console.log("当前队列元素:");
queue.print();
console.log("当前队列长度:");
console.log(queue.getSize()); // 3
console.log("当前队首元素:");
console.log(queue.getFront());
console.log("执行队列出队操作");
console.log(queue.remove());
console.log("当前队列元素:");
queue.print();
console.log("清空队列");
queue.clear();
console.log(queue.getSize());
结果:
es6实现
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;
})();