yocto-queue 队列 链表

42 阅读1分钟

本文参加了由公众号@若川视野发起的每周源码共读活动,点击了解详情一起参与

这是源码共读的第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 过程如下图所示

1.png

总结

公有属性声明

class Node {
  value; // 公有属性
  next; // 公有属性

  constructor(value) {
	this.value = value;
  }
}

私有属性声明

class Queue {
  #head; // 私有属性
  #tail; // 私有属性
  #size; // 私有属性

  constructor() {
    // ...
  }
}

Symbol.iterator

可参考 arrify 转数组