JavaScript实现队列结构

队列

基本概念

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出**(FIFO—first in first out**)线性表

手动实现

本质上还是借助数组去实现,本着队列的基本原则先进先出的原则进行设计。

export default class Queue {
  // 数据属性
  items: any = [];

  // 添加功能
  enqueue(element: any) {
    this.items.push(element);
  }
  // 删除功能,删除并返回头部元素,但是会影响一些性能
  dequeue() {
    return this.items.shift();
  }
  // 是否为空
  isEmpty() {
    return this.items.length === 0;
  }
  // 查看第一个元素
  front() {
    if (this.items.length === 0) {
      return '队列为空';
    } else {
      return this.items[0];
    }
  }
  // 长度方法
  size() {
    return this.items.length;
  }
  // toString方法,复杂结构不推荐使用
  toString() {
    let stackString = '';

    for (let i = 0; i < this.items.length; i++) {
      try {
        if (typeof this.items[i] === 'object') {
          // 排除复杂结构对该方法的影响
          throw new Error();
        }
        stackString += this.items[i] + ' ';
      } catch (e) {
        console.error('复杂结构不允许使用该方法');
      }
    }
    return stackString;
  }
}

常见题目

/**
 * 击鼓传花: 传入名单和暂停的数字,返回最后剩余人和在原列表中的下标
 * @params 人员名单
 * @params 暂停的数字
 * @return 最后剩余人的下标
 */
export const passGame = (nameList: Array<{ name: string; id: number }>, num: number) => {
  // 创建新的队列来完成目的
  const queue = new Queue();
  // 将传入的list装进队列中
  for (let i = 0; i < nameList.length; i++) {
    queue.enqueue(nameList[i]);
  }

  // 当队列大于1的时候都需要进行遍历
  while (queue.size() > 1) {
    // 小于num的时候,重新加入到队列末尾
    for (let i = 0; i < num - 1; i++) {
      queue.enqueue(queue.dequeue());
    }
    // 等于num这个人,直接从队列中删除掉
    queue.dequeue();
  }

  // 返回最后的人
  return nameList.indexOf(queue.front());
};

你可能感兴趣的:(数据结构,js,javascript,算法,数据结构)