1. 概念
- 线性表,只允许在一端进行插入,另一端进行删除操作;
- 先进先出,插入的一端为【队尾】rear,删除的一端为【队首】front,插入称之为进队,删除称之为出队;
- 删除队首之后,其后继元素成为队头;
2. 操作与实现
enqueue()
尾部添加一项;dequeue()
头部删除一项;front()
返回队列第一项;isEmpty()
是否为空;size()
返回队列长度;
function Queue() {
// 模拟队列
let items = [];
// 尾部插入
this.enqueue = function(element) {
items.push(element);
}
// 头部移出
this.dequeue = function() {
return items.shift()
}
// 返回第一项
this.front = function() {
return item[0];
}
// 是否为空
this.isEmpty = function() {
return items.length === 0
}
// 队列长度
this.size = function() {
return items.length;
}
// 打印
this.print = function() {
const res = items.toString();
console.log(res)
}
}
let queueIns = new Queue();
queueIns.enqueue(2)
queueIns.enqueue(3)
queueIns.enqueue(4)
queueIns.enqueue(5)
queueIns.enqueue(6)
queueIns.print()
3. 实践与应用--优先队列
【概念】
对列表中的每个元素都有各自的优先级,在插入的时候会根据优先级的高低顺序进行插入操作;
【规则】
优先码的值最小的元素优先级最高
【思路】
入队时,如果队列为空,则直接加入队列,否则进行比较;
priority最小的优先级最高,优先级越高放在队列的越前面;
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);
// case1 队列中已经包含元素
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;
}
}
// case2 队列中不包含元素
if (!added) {
items.push(queueElement);
}
}
// 移出队列第一项
this.dequeue = function() {
return items.shift();
}
this.front = function() {
return item[0];
}
this.isEmpty = function() {
return items.length === 0
}
this.size = function() {
return items.length;
}
this.print = function() {
for (let i = 0; i < items.length; i++) {
console.log(`${items[i].priority}=>${items[i].element}`)
}
}
}
let priorityQueue = new PriorityQueue();
priorityQueue.enqueue('a', 3)
priorityQueue.enqueue('b', 2)
priorityQueue.enqueue('c', 1)
priorityQueue.print()
// 1=>c
// 2=>b
// 3=>a