js中的数据结构之队列
一、定义
队列是一种一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。队列遵循先进先出的原则。
二、描述
队列的规则就类似于我们在去银行和医院时取号排队,先取到号的人先办理业务后面来的人需要排队等前面的人办理完成后在办理。
队列是一种先进先出的数据结构。
它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。
队列中没有任何元素时,称为空队列。
队列的两种主要操作是向队列中插入新元素和删除队列中的元素。我们也可以给队列添加其他用到的方法和属性如:清空队列、获取队列长度、获取队头数据等。
三、图示
四、属性和方法描述
1、enqueue
向队尾添加一个元素
2、dequeue
移除队头元素
3、front
仅读取队首元素
4、back
仅读取队尾元素
5、isEmpty
获取是否为空队列
6、size
队列的长度
7、clear
清空队列
五、代码实现
基于数组结构实现一个队列类。
class Queue {
constructor() {
// 基础数据
this.dataStore = [];
}
// 添加元素
enqueue(element) {
this.dataStore.push(element);
}
// 移除元素
dequeue() {
return this.dataStore.shift();
}
// 读取队首元素
front() {
return this.dataStore[0];
}
// 读取队尾元素
back() {
return this.dataStore[this.dataStore.length - 1];
}
// 是否为空队列
isEmpty() {
return this.dataStore.length === 0;
}
// 队列的长度
size() {
return this.list.length;
}
// 清空队列
clear() {
this.dataStore = [];
}
}
六、测试使用
const q = new Queue();
q.enqueue("123");
q.enqueue("abc");
q.enqueue("aoe");
console.log(q.size()); // 3
console.log(q.back()); // aoe
console.log(q.dequeue()); // 123
console.log(q.dequeue()); // abc
console.log(q.isEmpty(), q.size()); // false 1
q.clear();
console.log(q.isEmpty(), q.size()); // true 0
七、优先队列
一般来说先进入队列的一定会先出队列,但是也有写特殊情况在出队时根据优先级而不必遵守先进先出规则,我们称为优先队列。
如医院的急诊科,如果突然来了危重病人会排一个非常高的优先级从而可以优先办理问诊。
八、优先队列实现
优先队列在插入元素的时候要给每个元素设置优先级,我们有两个方式可以实现队列根据优先级出队的方法:
1、修改enqueue方法,在进行入队操作时就根据元素的优先级排好正确的顺序,然后根据顺序出队。
2、修改dequeue方法,在出队操作时,查询优先级最高的先出队。
下面我们使用第2种方法实现(数据较多的情况下使用1实现效率更高):
// 创建元素类
class CreateQE {
constructor(name, priority) {
this.name = name;
this.priority = priority;
}
}
class Queue {
constructor() {
// 源数据
this.dataStore = [];
}
// 添加元素
enqueue(element) {
this.dataStore.push(element);
}
// 移除元素
dequeue() {
let i = 0;
// priority值越小优先级越高,越先出队列
for (let index = 0; index < this.dataStore.length; index++) {
if (this.dataStore[index].code < this.dataStore[i].code) i = index;
}
return this.dataStore.slice(i, 1);
}
// 读取队首元素
front() {
return this.dataStore[0];
}
// 读取队尾元素
back() {
return this.dataStore[this.dataStore.length - 1];
}
// 是否为空队列
isEmpty() {
return this.dataStore.length === 0;
}
// 队列的长度
size() {
return this.dataStore.length;
}
// 清空队列
clear() {
this.dataStore = [];
}
}
九、优先队列测试和使用
const q = new Queue();
// 添加元素
q.enqueue(new CreateQE("小明", 1));
q.enqueue(new CreateQE("小红", 10));
q.enqueue(new CreateQE("小刚", 8));
q.enqueue(new CreateQE("小光", 6));
console.log(q.dequeue()); // {name: "小明", priority: 1}
console.log(q.dequeue()); // {name: "小光", priority: 6}
console.log(q.dequeue()); // {name: "小刚", priority: 8}
q.clear();
console.log(q.isEmpty()); // true