本文参加了由公众号@若川视野发起的每周源码共读活动,点击了解详情一起参与。
这是源码共读的第32期,链接:juejin.cn/post/709076…。
源码
class Node {
value;
next;
constructor(value) {
this.value = value;
}
}
export default class Queue {
#head; // 私有属性
#tail; // 私有属性
#size; // 私有属性
constructor() {
this.clear();
}
// 从队列尾部添加元素
enqueue(value) {
const node = new Node(value);
if (this.#head) {
this.#tail.next = node;
this.#tail = node;
} else {
this.#head = node;
this.#tail = node;
}
this.#size++;
}
// 从队列头部移除元素
dequeue() {
const current = this.#head;
if (!current) {
return;
}
this.#head = this.#head.next;
this.#size--;
return current.value;
}
// 清空队列
clear() {
this.#head = undefined;
this.#tail = undefined;
this.#size = 0;
}
// 获取队列长度
get size() {
return this.#size;
}
// 队列遍历接口
*[Symbol.iterator]() {
let current = this.#head;
while (current) {
yield current.value;
current = current.next;
}
}
}
const queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
console.log(queue.size); // 3
console.log([...queue]); // [1, 2, 3]
console.log(queue.dequeue()); // 1
console.log(queue.size); // 2
console.log([...queue]); // [2, 3]
enqueue 过程如下图所示
总结
公有属性声明
class Node {
value; // 公有属性
next; // 公有属性
constructor(value) {
this.value = value;
}
}
私有属性声明
class Queue {
#head; // 私有属性
#tail; // 私有属性
#size; // 私有属性
constructor() {
// ...
}
}
Symbol.iterator
可参考 arrify 转数组