JS 数据结构 - 队列

队列

普通队列

export namespace normalQueue {
    /**
     * @class Queue
     * @classdesc 数据结构: 队列(普通队列)
     *
     * 队列是 先进先出 的有序集合\
     * 队列在底部添加新元素,并从顶部移出元素 最新添加的元素排在队列末尾\
     * 就前端来讲,打开新标签页时,就相当于创建一个任务队列
     *
     * 普通队列实现时必须方法如下:
     *  - enqueue(element) 队尾入队
     *  - dequeue() 队首出队并返回移出元素
     *  - peek() 查看队首元素
     *  - isEmpty() 返回队列是否为空
     *  - size() 返回队列大小
     *  - clear() 清空队列
     *
     * 与 栈 类似, 队列采用 Map 存储数据
     * 用 lowestCount 指示 队首的键
     * 用 count 指示 队尾的键
     * 出队则 lowestCount ++
     * 入队则 count++
     */

    export abstract class Queue<T> {
        protected count!: number
        protected lowestCount!: number
        protected queue!: Map<number, T>

        /** 队尾入队 */
        abstract enqueue(Element: T): Map<number, T>

        /** 队首出队 */
        abstract dequeue(): T | undefined

        /** 查看队首元素 */
        abstract peek(): T | undefined

        /** 查看队列是否为空 */
        abstract isEmpty(): boolean

        /** 查看队列大小 */
        abstract size(): number

        /** 清空队列 */
        abstract clear(): boolean
    }

    export class Queue_accomplish<T> extends Queue<T> {

        constructor() {
            super()
            this.count = 0
            this.lowestCount = 0
            this.queue = new Map()
        }

        enqueue(Element: T): Map<number, T> {
            this.queue.set(this.count++, Element)
            return this.queue
        }

        dequeue(): T | undefined {
            if (this.isEmpty()) return undefined
            const result: T | undefined = this.queue.get(this.lowestCount)
            this.queue.delete(this.lowestCount)
            this.lowestCount++
            return result
        }

        peek(): T | undefined {
            if (this.isEmpty()) return undefined
            return this.queue.get(this.lowestCount)
        }

        isEmpty(): boolean {
            return this.queue.size === 0
        }

        clear(): boolean {
            this.queue.clear()
            this.count = 0
            this.lowestCount = 0
            return this.isEmpty()
        }

        size(): number {
            return this.queue.size
        }

        toString(): string {
            if (this.isEmpty()) return ''
            let objString: string = `${this.queue.get(this.lowestCount)}`
            for (let i = this.lowestCount + 1; i < this.count; i++) objString = `${objString}, ${this.queue.get(i)}`
            return objString
        }
    }
}

双端队列

export namespace dualEndQueue {
    /**
     * @class Queue
     * @classdesc 数据结构 队列(双端队列)
     *
     * 双端队列 允许同时从 队首和队尾 添加和移出元素的特殊队列
     *
     * 常见于存储一系列的可撤销操作:
     *  - 当用户操作时,该操作在双端队列 队尾入队
     *  - 当用户撤销时,该操作从双端队列 队尾出队
     *  - 当操作过多时,最先进行的操作 队首出队
     *
     * 由于双端队列同时遵守 先进先出 和 后进先出 原则
     * 可以说是 队列 和 栈 的结合
     * 必需方法如下:
     * - addBack(Element) 队尾入队
     * - removeFront() 队首出队
     * - peekFront() 查看队首元素
     * - addFront(Element) 队首入队 ( 双端队列特有 )
     * - removeBack() 队尾出队 ( 双端队列特有 )
     * - peekBack() 查看队尾元素 ( 双端队列特有 )
     *
     * 与队列实现方式类似,不过在\
     * 队首入队 时 需 lowestCount--\
     * 队尾入队 时 需 count--
     */
    export abstract class Queue<T> {
        protected count!: number
        protected lowestCount!: number
        protected queue!: Map<number, T>

        /** 队尾入队 */
        abstract addBack(Element: T): Map<number, T>

        /** 队首出队 */
        abstract removeFront(): T | undefined

        /** 查看队首元素 */
        abstract peekFront(): T | undefined

        /** 队首入队 */
        abstract addFront(Element: T): Map<number, T>

        /** 队尾出队 */
        abstract removeBack(): T | undefined

        /** 查看队尾元素 */
        abstract peekBack(): T | undefined

    }

    export class DEQueue<T> extends Queue<T>{
        constructor () {
            super()
            this.count = 0
            this.lowestCount = 0
            this.queue = new Map()
        }

        addFront(Element: T): Map<number, T> {
            this.queue.set(--this.lowestCount, Element)
            return this.queue
        }

        addBack(Element: T): Map<number, T> {
            this.queue.set(this.count++, Element)
            return this.queue
        }

        removeFront(): T | undefined {
            if (this.isEmpty()) return undefined
            const result = this.queue.get(this.lowestCount)
            this.queue.delete(this.lowestCount++)
            return result
        }

        removeBack(): T | undefined {
            if (this.isEmpty()) return undefined
            const result = this.queue.get(this.count)
            this.queue.delete(this.count--)
            return result
        }

        peekFront(): T | undefined {
            if (this.isEmpty()) return undefined
            return this.queue.get(this.lowestCount)
        }

        peekBack(): T | undefined {
            if (this.isEmpty()) return undefined
            return this.queue.get(this.count - 1)
        }

        /** 查看是否为空 */
        isEmpty(): boolean {
            return this.queue.size === 0
        }

        /** 查看队列大小 */
        size(): number {
            return this.queue.size
        }

        /** 覆盖默认 toString */
        toString(): string {
            if (this.isEmpty()) return ''
            let objString = `${this.queue.get(this.lowestCount)}`
            for (let i = this.lowestCount + 1; i < this.count; i++) objString = `${objString}, ${this.queue.get(i)}`
            return objString
        }
    }
}

JS 数据结构 - 队列
http://localhost:8080/archives/102a41e2-9cbc-473e-a8a8-96da9f1ecd1a
作者
inksha
发布于
2024年09月14日
许可协议