根据书上例子的实际要求,涉及到js队列的问题。所以先把js中队列的具体实现数据结构贴出来。具体参考《学习javascript数据结构和算法》第四章。
队列数据结构遵循先入先出的原则。入队操作添加到数组的末尾,返回新数组。出队操作弹出数组第一个元素,返回新数组。两个操作对于数组都有结构的改变
//js中队列的实现是依赖数组的数据结构
function Queue() {
let items = []; //初始化空数组,let关键字是es6中的
//用于形成大括号包围的作用域
this.enqueue = function(element){ //入队操作
items.push(element); //数组push操作
};
this.dequeue = function(){//出对
return items.shift(); //数组shift操作
};
this.front = function(){ //队列第一个元素
return items[0]; //数组第一个元素
};
this.isEmpty = function(){ //判断队列有无成员
return items.length == 0; //布尔值判断
};
this.clear = function(){ //清空队列
items = []; //变量重新赋值空数组
};
this.size = function(){ //获得队列的长度
return items.length;
};
this.print = function(){ //打印队列
console.log(items.toString());
};
}
下面是优先队列。数据成员入队的时候要携带数据和优先级。
优先级在这里的定义是数字越大在数组中的位置靠后。当插入一个数组元素的时候,先要根据它的优先级来判断,最小是直接插入到第一位,紧邻一个比他大的优先级是,就插入到这个邻居的前面。如果是最大的数字就插到数组的最后。
一维数组变成了二位数组。
function PriorityQueue() {
let items = [];
function QueueElement (element, priority){
this.element = element;//成员本身
this.priority = priority; //优先级
}
this.enqueue = function(element, priority){
let queueElement = new QueueElement(element, priority);
let added = false; //添加标记
for (let i=0; i<items.length; i++){
if (queueElement.priority <
items[i].priority){ //找到优先级数字比他大的那个元素
items.splice(i,0,queueElement);
// 插到这个元素的前面
added = true;
break; // 终止
}
}
if (!added){ //如果是优先级数字是最大的,直接插入到
//数组的末尾
items.push(queueElement); //{5}
}
};
//其他操作和普通队列是一样的
this.dequeue = function(){
return items.shift();
};
this.front = function(){
return items[0];
};
this.isEmpty = function(){
return items.length == 0;
};
this.size = function(){
return items.length;
};
//print使用了es6里的拼接字符串的方法
this.print = function(){
for (let i=0; i<items.length; i++){
console.log(`${items[i].element} - ${items[i].priority}`);
}
};
}
let priorityQueue = new PriorityQueue();
priorityQueue.enqueue("John", 2);
priorityQueue.enqueue("Jack", 1);
priorityQueue.enqueue("Camila", 1);
priorityQueue.enqueue("Maxwell", 2);
priorityQueue.enqueue("Ana", 3);
priorityQueue.print();
//=>
//打印出的结果
Jack - 1 //数组元素--优先级
Camila - 1
John - 2
Maxwell - 2
Ana - 3
在这个队列的基础上可以实现javascript中桥接模式的例子。本文算是一个独立的javascript队列的介绍,也作为桥接模式例子的背景方法。
javascript设计模式 第八章-桥接模式