使用TS实现各种队列

354 阅读1分钟

使用TS实现各种队列

简单队列

interface QueueType<T> {
  deQueue(): T | undefined

  enQueue( element: T ): void

  front(): T | undefined

  size(): number

  isEmpty(): boolean

  clear(): void
}

interface itemsType<T> {
  [key: number]: T
}

export default class Queue<T> implements QueueType<T> {

  private items: itemsType<T> = {}
  private frontIndex: number = 0
  private backIndex: number = 0

  //出队
  deQueue(): T | undefined {
    if ( this.isEmpty() ) {
      throw new Error( '队列已空,禁止出队' )
    }
    let res = this.items[this.frontIndex]
    delete this.items[this.frontIndex++]
    return res
  }

  //入队
  enQueue( data: T ): void {
    this.items[this.backIndex++] = data
  }

  //返回对头元素
  front(): T | undefined {
    return this.items[this.frontIndex]
  }

  // //返回队列长度
  size(): number {
    return this.backIndex - this.frontIndex
  }

  //
  // //判断队列是否为空
  isEmpty(): boolean {
    return this.backIndex - this.frontIndex === 0
  }

  //
  // //清空队列
  clear(): void {
    this.items = {}
    this.frontIndex = 0
    this.backIndex = 0
  }
}

双端队列

interface DequeType<T> {
  addFront( element: T ): void

  removeFront(): T | undefined

  addBack( element: T ): void

  removeBack(): T | undefined

  size(): number

  isEmpty(): boolean

  clear(): void
}

interface itemsType<T> {
  [key: number]: T
}

export default class Deque<T> implements DequeType<T> {
  private items: itemsType<T> = {}
  private frontIndex: number = 0
  private backIndex: number = 0

  addFront( element: T ): void {
    this.items[--this.frontIndex] = element
  }

  removeFront(): T | undefined {
    if ( this.isEmpty() ) {
      throw new Error( '队列已空,禁止出队' )
    }
    const res = this.items[this.frontIndex]
    delete this.items[this.frontIndex++]
    return res
  }

  addBack( element: T ): void {
    this.items[this.backIndex++] = element
  }

  removeBack(): T | undefined {
    if ( this.isEmpty() ) {
      throw new Error( '队列已空,禁止出队' )
    }
    const res = this.items[this.backIndex - 1]
    delete this.items[--this.backIndex]
    return res
  }

  // //返回队列长度
  size(): number {
    return this.backIndex - this.frontIndex
  }

  //
  // //判断队列是否为空
  isEmpty(): boolean {
    return this.backIndex - this.frontIndex === 0
  }

  //
  // //清空队列
  clear(): void {
    this.items = {}
    this.frontIndex = 0
    this.backIndex = 0
  }
}