JS 实现队列

这篇博客介绍了如何使用JavaScript实现三种队列数据结构:普通队列、循环队列和循环阻塞队列。普通队列遵循先进先出的原则;循环队列解决了队列满的问题,利用模运算实现;循环阻塞队列在队列满时将任务存储到另一个队列,待空间释放后再执行。
摘要由CSDN通过智能技术生成

通过JS实现队列的数据结构,首先是最普通的队列,先入先出
在这里插入图片描述

// 队列
function createQueue() {
  // 队列
  let queue = []
  // 入队
  const enQueue = (data) => {
    if(data == null) return
    queue.push(data)
  }
  // 出队
  const deQueue = () => {
    if(queue.length === 0) return 
    const data = queue.shift()
    return data
  }
  // 获取列表
  const getQueue = () => {
    // 返回一个克隆的数组,避免外界直接操作
    return Array.from(queue)
  }
  return {
    enQueue,
    deQueue,
    getQueue
  }
}

还有就是循环队列
在这里插入图片描述

// 循环队列
function cirQueue (n) {
  // 设置队列大小
  if(!n) return console.error('创建失败,请按照cirQueue(n: number)格式传入')
  // 队尾
  let tial = 0
  // 队头
  let head = 0
  // 队列
  let queue = []
  // 入队
  function enQueue(data) {
    try {
      // 判断队列是否已满
      if((tial + 1) % n === head) return console.error('队列已满')
      tial = (tial + 1) % n
      queue.push(data)
    } catch(error) {
      console.log('error----', error)
    }
  }
  // 出队
  function deQueue() {
    try {
      // 判断空队列
      if(head === tial) return console.log('队列为空')
      head = (head + 1) % n
      let item = queue.shift()
      return item
    } catch(error) {
      console.log('error------', error)
    }
  }
  // 获取队列
  function getQueue() {
      try {
        return Array.from(queue)
      } catch(error) {
        console.log('error-----', error)
      }
  }
  // 获取队头、尾
  function getQueueHeadAndTial() {
    return {
      tial,
      head
    }
  }
  return {
    enQueue,
    deQueue,
    getQueue,
    getQueueHeadAndTial
  }
}

正常队列可能存在存满的情况,因此需要一定容错机制,当队列满了,可以先把任务存储下来
在这里插入图片描述

// 循环阻塞队列
function cirBlockQueue (n) {
  // 设置队列大小
  if(!n) return console.error('创建失败,请按照cirQueue(n: number)格式传入')
  // 队尾
  let tial = 0
  // 队头
  let head = 0
  // 队列
  let queue = []
  // 阻塞队列
  let waitQueue = cirQueue(n)
  // 入队
  function enQueue(data) {
    try {
      // 判断队列是否已满
      // 阻塞后不直接返回错误 把操作存储下来
      // if((tial + 1) % n === head) return console.error('队列已满')
      if((tial + 1) % n === head) {
        // 阻塞队列未满
        const { head: waitQueueHead, tial: waitQueueTial } = waitQueue.getQueueHeadAndTial()
        if((waitQueueTial + 1) % n !== waitQueueHead) {
          waitQueue.enQueue(data)
          return 
        } else {
          return console.error('队列已满')
        }
      }
      tial = (tial + 1) % n
      queue.push(data)
    } catch(error) {
      console.log('error----', error)
    }
  }
  // 出队
  function deQueue() {
    try {
      // 判断空队列
      if(head === tial) return console.log('队列为空')
      head = (head + 1) % n
      let item = queue.shift()
      // 阻塞队列不为空
      const { head: waitQueueHead, tial: waitQueueTial } = waitQueue.getQueueHeadAndTial()
      if(waitQueueHead !== waitQueueTial) {
        enQueue(waitQueue.deQueue())
      }
      return item
    } catch(error) {
      console.log('error------', error)
    }
  }
  // 获取队列
  function getQueue() {
      try {
        return Array.from(queue)
      } catch(error) {
        console.log('error-----', error)
      }
  }
  return {
    enQueue,
    deQueue,
    getQueue,
    tial,
    head
  }
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值