es6-algorithm 之 Queue和应用

Queue的概念

我们知道队列是一种常用的先进先出(FIFO)的有序集合。队列的实际应用其实非常广泛。比如排队,event loop里的事件队列,优先队列,循环队列,操作系统中也大量运用队列。废话不多说,看看实现。

Queue队列的实现

首先创建Queue, Queue一般有 enqueue(队列尾部插入一条数据),dequeue(删除队列第一条数据,也就是最先进来的那条), front(获取队列第一条数据),size (队列的长度),isEmpty(判断队列是否空),print(打印整个队列信息)等方法。基本结构如下。

const Queue = (() => {
  const wp = new WeakMap()
  class Queue {
    constructor () {
      wp.set(this, [])
    }

    enqueue (ele) {
      wp.get(this).push(ele)
    }
    dequeue () {
      return wp.get(this).shift()
    }
    front () {
      return wp.get(this)[0]
    }
    isEmpty () {
      return wp.get(this).length === 0
    }
    size () {
      return wp.get(this).length
    }
    print () {
      return wp.get(this).toString()
    }
  }

  return Queue
})()

具体使用如下:

let q = new Queue()

q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
q.enqueue(4)

q.dequeue()

console.log(q.print())

结果应该是: 2,3,4

循环队列-击鼓传花游戏

游戏规则就是,n个孩子围成一个圆圈,把花尽快的传给旁边的人。某个时刻传花截至,这个时候花在谁手上,谁就退出圆圈结束游戏。重复这个过程,直到只剩下一个孩子(胜者)。
利用上面创建的Queue class,实现如下:

function flower (arr, num) {
  let que = new Queue()

  for (let i = 0; i < arr.length; i++) {
    que.enqueue(arr[i])
  }
  let name = ''
  while (que.size() > 1) {
    for (let i = 0; i < num; i++) {
      que.enqueue(que.dequeue())
    }
    name = que.dequeue()
    console.log(name + '  get out')
  }
  console.log(que.dequeue() + '  win')
}
let arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

flower(arr, 8)

最后h胜出,结果如下:

i  get out
a  get out
c  get out
f  get out
d  get out
e  get out
b  get out
g  get out
h  win

以上..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值