数据结构-前端-队列

283 阅读1分钟

概述

队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。队列被用在很多地方,比如 提交操作系统执行的一系列进程、打印任务池等,一些仿真系统用队列来模拟银行或杂货 店里排队的顾客。

主要方法和属性

  • enqueue 向队列末尾添加一个元素
  • dequeue 删除队首元素
  • front 读取队首元素
  • back 读取队尾元素
  • empty 判断队列是否为空
  • length 获取队列长度

javascript实现

class Queue {
  constructor() {
    this.dataStore = [];
  }
  // 向队列末尾添加一个元素
  enqueue(element) {
    this.dataStore.push(element)
  }
  // 删除队首元素
  dequeue() {
    return this.dataStore.shift();
  }
  // 读取队首元素
  front() {
    return this.dataStore[0];
  }
  // 读取队尾元素
  back() {
    return this.dataStore[this.dataStore.length - 1];
  }
  // 判断队列是否为空
  empty() {
    return this.dataStore.length === 0;
  }
  // 获取队列长度
  length() {
    return this.dataStore.length;
  }
}

使用场景

  1. 使用队列对数据进行排序
    对于 0~99 的数字,基数排序将数据集扫描两次。第一次按个位上的数字进行排序,第二 次按十位上的数字进行排序。每个数字根据对应位上的数值被分在不同的盒子里。
const originArr = [91, 31, 92, 22, 85, 15, 35, 46];

const getQueuesMap = () => {
  const queueMap = {};
  for(let i = 0; i < 10; i++) {
    queueMap[i] = new Queue();
  }
  return queueMap;
}

const sortArr = (array) => {
  const singleQueue = getQueuesMap();
  const finalQueue = getQueuesMap();
  for(let i = 0; i < array.length; i++) {
    const singleNum = array[i]%10;
    singleQueue[singleNum].enqueue(array[i]);
  }
  for(let i in singleQueue) {
    while(singleQueue[i].dataStore.length) {
      const num = singleQueue[i].dequeue();
      const digitNum = Math.floor( num / 10);
      finalQueue[digitNum].enqueue(num);
    }
  }
  return Object.values(finalQueue).map(item => item.dataStore).flat();
}

console.log(sortArr(originArr));

console.log(sortArr([45,72, 93, 51, 21, 16, 70, 41, 27, 31]))

总结

队列在前端实际开发场景中运用的不多,尤其在js中原生实现了数组。我们可以通过数组使用所有队列或者栈所覆盖的场景,但是了解队列这种数据结构有助于拓宽我们的视野,为后续的算法学习打下基础