手动实现数据结构-队列结构

96 阅读1分钟

1.队列结构

  • 是一种受限的线性结构
  • 特点:先进先出

2.使用JS实现

// 自定义队列
function Queue() {
        var items = []

        // 队列操作的方法
        // enter queue方法
        this.enqueue = function (element) {
            items.push(element)
        }

        // delete queue方法
        this.dequeue = function () {
            return items.shift()
        }

        // 查看前端的元素
        this.front = function () {
            return items[0]
        }

        // 查看队列是否为空
        this.isEmpty = function () {
            return items.length == 0
        }

        // 查看队列中元素的个数
        this.size = function () {
            return items.length
        }
    }

3.使用TS实现

class ArrayQueue<T>{
  //创建一个数组用于存储
  private arr:T[]=[]
  enqueue(e: T): void {
    this.arr.push(e)
  }
  dequeue(): T | undefined {
    return this.arr.shift()
  }
  peek(): T | undefined {
    return this.arr[0]
  }
  isEmpty(): boolean {
    return this.arr.length===0
  }
  size(): number {
    return this.arr.length
  }  
}
export default ArrayQueue

4.相关题目

4.1 击鼓传花

import ArrayQueue from "./01-实现队列结构"

function hotPotato(arr:string[],num:number):number{
  if(arr.length===0)return-1
  //创建队列
  const queue=new ArrayQueue<string>()
  //把所有项添加到队列里
  for(let i=0;i<arr.length;i++){
    queue.enqueue(arr[i])
  }
 
  
  //当队列里剩下一个时终止循环,即size大于1的时候继续循环
  while(queue.size()>1){
    //第num前的出列再入列(从第一个开始,这个循环表示出列入列次数,数数从第一个开始数)
    for(let i=1;i<num;i++){
      const name=queue.dequeue()
      if(name) queue.enqueue(name)//因为出列的有可能为undefined
    }
    //第num个出列不再入列
    queue.dequeue()
  }
  //return queue.dequeue() //返回的是值。此时就剩下一个
  const index=arr.indexOf(queue.dequeue()!)//有可能为undefined所以加个!(断言此时一定有值)
  return index

}

4.2 约瑟夫环

类似击鼓传花

import ArrayQueue from "./01-实现队列结构"

function lastRemaining(n:number,m:number){
  const queue=new ArrayQueue<number>()
  for(let i=0;i<n;i++){
    queue.enqueue(i)
  }
  while(queue.size()>1){
    for(let i=1;i<m;i++){
      queue.enqueue(queue.dequeue()!)
    }
    queue.dequeue()
  }
  return queue.dequeue()
}