返回

用心掌握JS中的队列类,一招制胜击鼓传花!

前端

队列类:幕后功臣

队列是一种先进先出的(FIFO)数据结构,就像是在现实世界中排队一样。队列类负责管理队列中的元素,并提供一系列操作方法,如添加、删除和读取元素。

1. 构筑队列蓝图

class Queue {
  // 构造函数,初始化队列
  constructor() {
    this.items = [];
  }

  // 入队操作,在队列尾部添加元素
  enqueue(element) {
    this.items.push(element);
  }

  // 出队操作,从队列头部移除并返回元素
  dequeue() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.items.shift();
  }

  // 查看队列首部的元素,但不删除它
  peek() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.items[0];
  }

  // 判断队列是否为空
  isEmpty() {
    return this.items.length === 0;
  }

  // 获取队列的长度
  size() {
    return this.items.length;
  }

  // 清空队列
  clear() {
    this.items = [];
  }
}

2. 击鼓传花:队列大显身手

有了队列类,我们就可以用它来实现击鼓传花游戏了。游戏规则很简单:一群人围成一圈,手里拿着一个花。当音乐响起时,花开始在人群中传递。当音乐停止时,拿着花的人被淘汰。游戏继续,直到只剩下最后一个人。

// 创建队列,代表游戏中的参与者
const queue = new Queue();

// 将参与者添加到队列中
const players = ["Alice", "Bob", "Carol", "Dave", "Eve"];
players.forEach((player) => queue.enqueue(player));

// 模拟击鼓传花游戏
while (queue.size() > 1) {
  // 音乐响起,花开始传递
  for (let i = 0; i < 5; i++) {
    // 从队列头部取出一个参与者,并将其添加到队列尾部
    const player = queue.dequeue();
    queue.enqueue(player);
  }

  // 音乐停止,淘汰当前队列首部的参与者
  const eliminatedPlayer = queue.dequeue();
  console.log(`${eliminatedPlayer} 被淘汰了!`);
}

// 游戏结束,宣布最后的获胜者
const winner = queue.dequeue();
console.log(`恭喜 ${winner} 获胜!`);

结语

通过构建队列类和击鼓传花游戏的实现,我们不仅学习了队列这种数据结构,也体验了将抽象数据结构应用于实际问题的乐趣。希望你能从这篇文章中有所收获,并在未来的编程实践中灵活运用队列类,解决更多复杂的问题。