使用TypeScript实现队列

43 阅读1分钟

声明队列

interface IQueue<T> {
  enqueue(element: T): void

  dequeue(): T | undefined

  peek(): T | undefined

  isEmpty(): boolean

  size(): number
}

export default IQueue

使用数组实现

import IQueue from "./IQueue"

class ArrayQueue<T> implements IQueue<T>{
  // 内部是通过数组保存
  private data: T[] = []
  enqueue(element: T): void {
    this.data.push(element)
  }
  dequeue(): T | undefined {
    return this.data.shift()
  }
  peek(): T | undefined {
    return this.data[0]
  }
  isEmpty(): boolean {
    return this.data.length === 0
  }
  size(): number {
    return this.data.length
  }
}

export default ArrayQueue

约瑟夫环

import ArrayQueue from "./01数组实现";

// n:插入从0到n-1的数字;m:数到m时删掉这个数字
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++) {
      // !这个符号是 TypeScript 中的非 null 断言运算符。它的作用是告诉 TypeScript 编译器:这个变量肯定不是 null 或者 undefined
      queue.enqueue(queue.dequeue()!)
    }

    queue.dequeue()
  }

  return queue.dequeue()!
}

console.log(lastRemaining(5, 3)) // 3
console.log(lastRemaining(10, 17)) // 3