JS--数据结构与算法--队列

185 阅读1分钟

什么是队列?

队列的概念已经不用解释了,(排队)但要牢记一点的是:

  • 队列只能在头部删除元素,在尾部添加元素

实现一个简单的队列

function Queue() {
  let items = []

  // 向队列尾部增加一个元素,注意只能从队尾增加元素
  this.enqueue = function (elements) {
    items.push(elements)
  }

  // 删除一个元素,只能在队的头部删除元素,
  // 数组的shift方法从最左侧增加一个元素,实现了只能在头部删除数据的要求
  this.dequeue = function () {
     return items.shift()
  }

  // 返回队列元素个数
  this.size = function () {
    return items.length
  }
  // 返回队列头部元素
  this.head = function () {
    return items[0]
  }

  // 删除队列元素
  this.clear = function () {
    items = []
  }
  // 队列是否为空
  this.isEmpty = function () {
    return items.length === 0
  }
  // 返回队尾
  this.tail = function() {
    return items[items.length - 1]
  }
}

队列应用

约瑟夫环

  • 有一个数组[0-99],要求每个两个数删除一个数字,到末尾时,循环至开头继续进行,循环至开头继续进行,求最后一个被删除的数。

算法步骤:

  • 从队列头部拿出一个元素, index + 1
  • 如果index %3 === 0,说明这个元素是需要删除的元素,如果不等于0,就不是需要删除的元素,则把他放到队列的尾部。
function del_ring(arr) {
  let queue = new Queue()
  let index = 0

  // 把数组中元素,0-99,放入队列中 0-99
  for(let i = 0; i < arr.length; i++) {
    queue.enqueue(arr[i])
  }

  while (queue.size() !== 1) {
    // 弹出队首元素
    let item = queue.dequeue()
    index += 1
    if(index %3 !== 0) {
      queue.enqueue(item)
    }
  }

  return queue.head()
}

let arr_list = [];
for(let i=0;i< 100;i++){
  arr_list.push(i);
}

console.log(del_ring(arr_list))