目录
1、队列的定义
队列是遵循先进先出(FIFO,也称为先来先服务)原则的一组有序的项。队列在尾部添加新的元素,并在顶部移除元素。最新添加的元素必须排在队列的末尾。
(学习JavaScript数据结构与算法(第三版))
2、队列结构的实现
2.1、队列的常见方法队列常见的操作
enqueue(element)
向队列尾部添加一个(或多个)新的项。
dequeue()
移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
front()
返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息与 Map 类的 peek 方法非常类似)。
isEmpty()
如果队列中不包含任何元素,返回 true,否则返回 false。
size()
返回队列包含的元素个数,与数组的 length 属性类似。
toString()
将队列中的内容,转成字符串形式。
2.2、代码实现
书上用的是对象来封装的队列,我这里用数组来封装,实现的逻辑的一样的
class Queue {
constructor() {
this.items = [];
};
//向队列尾部添加一个新的项
enqueue(element) {
this.items.push(element);
};
//移除队列的第一项,并返回被移除的元素
dequeue() {
if (this.items.length) {
return this.items.shift();
};
};
//返回队列的第一个元素
front() {
return this.items[0];
};
//队伍中是否包含元素
isEmpty() {
return this.items.length === 0;
};
//返回队伍中的元素个数
size() {
return this.items.length;
};
//将队伍中的元素转换为字符串
toString() {
let str = '';
for (let i = 0; i < this.items.length; i++) {
str += '' + this.items[i];
}
return str;
};
};
2.3、优先级队列
这里我只写了入队的方法,其余方法和上面类似
// 优先级队列中的每一项,每个项为一个对象,每个对象包含值和优先级
class QueueElement {
constructor(element, priority) {
this.element = element; // 值
this.priority = priority;//优先级
};
};
class Queue {
constructor() {
this.item = [];
};
enqueue(element, priority) {
// 设定为0为最大优先级,0、1、2、3...优先级以此递减
let queueElement = new QueueElement(element, priority);
let flag = 1;//比较优先级,最大记录为1,较小记录为0
if (this.item.length == 0) {
// 如果队列为空直接入队
this.item.push(queueElement);
} else {
for (let i = 0; i < this.item.length; i++) {
// 循环比较优先级
if (this.item[i].priority > queueElement.priority) {
this.item.splice(i, 0, queueElement);
flag = 0;
break;
};
};
if (flag == 1) {
this.item.push(queueElement);
};
};
};
};
3、队列的应用
// 击鼓传花
let q = new Queue;
let person = ['小花', '小李', '小丽', '张三', '李四', '王五'];
let hotPotato = function (arr, n) {
if (n === 0) return false;//不能传入0
// 先循环添加数据
for (let i = 0; i < arr.length; i++) {
q.enqueue(arr[i]);
};
// 通过while循环控制整个击鼓传花流程,当只剩下一个人的时候停止循环
while (q.items.length > 1) {
for (let j = 0; j < n - 1; j++) {
q.enqueue(q.dequeue());
};
q.dequeue();
};
return q.items[0];
};
4、总结
记录学习,当个笔记