定场诗

马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁!

前言

本章为重读《学习JavaScript数据结构与算法-第三版》的系列文章,主要讲述队列数据结构、双端队列数据结构以及队列相关应用。

队列

队列是遵循先进先出(FIFO)原则的一组有序的项。队列在尾部添加元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。现实中常见的队列就是排队,计算机科学中,常见的例子是打印队列,如文档按顺序打印,第一个发送到打印队列的文档优先被打印。

实现队列

/**  * class Queue 队列类  * 特点:先进先出  */ class Queue {   construcor () {     // 存储数据     this.items = {}     // 队列头部元素索引     this.lowestCount = 0     // 队列尾部元素索引     this.count = 0   }    /**    * enqueue() 添加元素到队列 - 先进先出    * @param {*} element 添加到队列的元素    */   enqueue (elemenet) {     this.items[this.count] = element     this.count++   }    /**    * dequeue() 移除队列头部元素 - 先进先出    * @returns {*} result 返回头部元素    */   dequeue () {     if (this.isEmpty()) {       return undefined     }     let result = this.items[this.lowestCount]     delete this.items[this.lowestCount]     this.lowestCount++     return result   }    /**    * peek() 返回队列头部元素    * @returns {*}    */   peek () {     if (this.isEmpty()) {       return undefined     }     return this.items[this.lowestCount]   }    /**    * isEmpty() 判断队列是否为空    * @returns {Boolean}    */   isEmpty () {     return this.count === this.lowestCount   }    /**    * size() 队列长度    * @returns {Number}    */   size () {     return this.count - this.lowestCount   }    /**    * clear() 清空队列    */   clear () {     this.items = {}     this.count = 0     this.lowestCount = 0   }    /**    * toString() 返回队列的字符串结构    * @returns {String}    */   toString () {     if (this.isEmpty()) {       return ''     }     let queueStr = `${this.items[this.lowestCount]}`     for (let i = this.lowestCount + 1; i < this.count; i++) {       queueStr = `${queueStr},${this.items[i]}`     }     return queueStr   } }

使用队列

// 实例化队列 const queue = new Queue()  // 判断队列是否为空 console.log(queue.isEmpty()) // true  // 向队列中添加元素 queue.enqueue('John') queue.enqueue('Jack')  console.log(queue.toString()) // John,Jack  queue.enqueue('Camila')  console.log(queue.toString()) // John,Jack  console.log(queue.size()) // 3  console.log(queue.isEmpty()) // false

以上操作示意图:
操作示意图