JavaScript 数据结构——队列
JavaScript 数据结构(二)队列
什么是队列
队列是一种受限的线性结构,只能从一段取出元素(队首
),从另一端放入元素(队尾
)
队列的特点
:先进先出,后进后出
队列常见的操作
enqueue(element)
向队列尾部添加一个(或多个)新的项。dequeue()
移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。front()
返回队列中的第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息与 Map 类的 peek 方法非常类似)。isEmpty()
如果队列中不包含任何元素,返回 true,否则返回 false。size()
返回队列包含的元素个数,与数组的 length 属性类似。toString()
将队列中的内容,转成字符串形式。
JavaScript (数组)代码实现
function Queue() {
this.queue = []
}
Queue.prototype.enqueue = function(element) {
this.queue.push(element);
}
Queue.prototype.dequeue = function() {
return this.queue.shift()
}
Queue.prototype.front = function() {
return this.queue[0];
}
Queue.prototype.isEmpty = function() {
return this.queue.length === 0;
}
Queue.prototype.size = function() {
return this.queue.length;
}
Queue.prototype.toString = function() {
let result = ''
this.queue.forEach(value => {
result += value + ' '
});
return result;
}
//击鼓传花
function passGame(NameList, number) {
const queue = new Queue();
NameList.forEach(value => {
queue.enqueue(value);
});
while (queue.size() > 1) {
for (var i = 0; i < number - 1; i++) {
queue.enqueue(queue.dequeue());
}
queue.dequeue();
}
return queue.dequeue();
}
const result = passGame([1, 2, 3, 4, 5], 3);
console.log(result);
优先队列
- 每个元素不再只是一个数据,还包含优先级。
- 在添加元素过程中,根据优先级放入到正确位置。
class QueueElement {
constructor(element, priority) {
this.element = element;
this.priority = priority;
}
}
class PriorityQueue {
constructor() {
this.queue = []
}
enqueue(element, priority) {
const queueElement = new QueueElement(element, priority);
if (this.isEmpty()) {
this.queue.push(queueElement)
} else {
let flag = false;
for (var i = 0; i <= this.queue.length - 1; i++) {
if (this.queue[i].priority > priority) {
this.queue.splice(i, 0, queueElement);
flag = true;
break;
}
}
if (!flag) {
this.queue.push(queueElement);
}
}
}
dequeue() {
return this.queue.shift();
}
front() {
return this.queue[0]
}
isEmpty() {
return this.queue.length == 0;
}
size() {
return this.queue.length;
}
toString() {
let result = '';
this.queue.forEach(value => {
result += value + ' ';
})
return result;
}
}
const priorityQueue = new PriorityQueue();
priorityQueue.enqueue("A", 10);
priorityQueue.enqueue("B", 15);
priorityQueue.enqueue("C", 11);
priorityQueue.enqueue("D", 20);
priorityQueue.enqueue("E", 18);
console.log(priorityQueue);