队列是一种遵循先进先出(FIFO, First In First Out)原则的线性数据结构。队列中的元素从一端插入,从另一端移除。在 JavaScript 中,可以通过数组或者自定义类来实现队列。
队列的基本概念
队列的数据结构与现实生活中的排队类似,比如在银行、车站等地方排队等候服务。最先进入队列的人最先被服务,这就是队列的先进先出特性。
队列的主要操作
- enqueue(element):向队列尾部添加一个新的项。
- dequeue():移除队列的第一项,并返回该项。
- front():返回队列中的第一个元素,但不删除它。
- isEmpty():如果队列为空,则返回 true,否则返回 false。
- size():返回队列中元素的数量。
使用数组实现队列
创建队列类
我们可以使用数组来实现一个简单的队列类:
// www.javascriptcn.com code example
class Queue {
constructor() {
this.items = [];
}
// 向队列尾部添加一个新的项
enqueue(element) {
this.items.push(element);
}
// 移除队列的第一项,并返回该项
dequeue() {
if (this.isEmpty()) {
return "Underflow";
}
return this.items.shift();
}
// 返回队列中的第一个元素
front() {
if (this.isEmpty()) {
return "No elements in Queue";
}
return this.items[0];
}
// 如果队列为空,则返回 true,否则返回 false
isEmpty() {
return this.items.length === 0;
}
// 返回队列中元素的数量
size() {
return this.items.length;
}
// 输出队列中的所有元素
printQueue() {
let str = "";
for (let i = 0; i < this.items.length; i++) {
str += this.items[i] + " ";
}
return str;
}
}使用队列类
// www.javascriptcn.com code example let queue = new Queue(); console.log(queue.isEmpty()); // true queue.enqueue(1); queue.enqueue(2); queue.enqueue(3); console.log(queue.size()); // 3 console.log(queue.front()); // 1 console.log(queue.dequeue()); // 1 console.log(queue.dequeue()); // 2 console.log(queue.size()); // 1 console.log(queue.printQueue()); // "3"
使用自定义类实现队列
除了使用数组,我们还可以通过创建自定义类来实现队列。这种方法可以更好地控制队列的行为,避免数组的一些限制。
自定义队列类
// www.javascriptcn.com code example
class CustomQueue {
constructor() {
this.count = 0;
this.lowestCount = 0;
this.items = {};
}
// 向队列尾部添加一个新的项
enqueue(element) {
this.items[this.count] = element;
this.count++;
}
// 移除队列的第一项,并返回该项
dequeue() {
if (this.isEmpty()) {
return undefined;
}
const result = this.items[this.lowestCount];
delete this.items[this.lowestCount];
this.lowestCount++;
return result;
}
// 返回队列中的第一个元素
front() {
if (this.isEmpty()) {
return undefined;
}
return this.items[this.lowestCount];
}
// 如果队列为空,则返回 true,否则返回 false
isEmpty() {
return this.count - this.lowestCount === 0;
}
// 返回队列中元素的数量
size() {
return this.count - this.lowestCount;
}
// 输出队列中的所有元素
printQueue() {
if (this.isEmpty()) {
return "Queue is empty";
}
let objString = `${this.items[this.lowestCount]}`;
for (let i = this.lowestCount + 1; i < this.count; i++) {
objString = `${objString}, ${this.items[i]}`;
}
return objString;
}
}使用自定义队列类
// www.javascriptcn.com code example
let customQueue = new CustomQueue();
customQueue.enqueue("John");
customQueue.enqueue("Jack");
customQueue.enqueue("Camila");
console.log(customQueue.size()); // 3
console.log(customQueue.front()); // John
console.log(customQueue.dequeue()); // John
console.log(customQueue.dequeue()); // Jack
console.log(customQueue.size()); // 1
console.log(customQueue.printQueue()); // "Camila"以上就是 JavaScript 中队列的基本操作和实现方法。队列是许多算法和数据结构的基础,掌握队列对于进一步学习计算机科学至关重要。