重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列
定场诗
马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁!
前言
本章为重读《学习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
以上操作示意图: