双端队列 double-end queue 是一种允许我们同时从前端和后端添加和移除的元素的特殊队列。
双端队列同时遵守了先进先出和后进先出原则,可以说它是把队列和栈相结合的一种数据结构。
双端队列的方法
- addFront(element) 在前端添加新元素
- addBlack(element) 在后端添加新元素
- removeFront() 从前端移除第一个元素
- removeBack() 从后端移除第一个元素
- peekFront() 返回前端的第一个元素
- peekBack() 返回后端的第一个元素
- isEmpty() 是否空双端队列
- clear() 清空双端队列
-
实现
class deque {constructor() {this.count = 0;this.lowestCount = 0;this.items = {};}addFront(element) {if (this.isEmpty()) {this.addBack(element);} else if (this.lowestCount > 0) {this.lowestCount--;this.items[this.lowestCount] = element;} else {for (let i = this.count; i > 0; i--) {this.items[i] = this.items[i - 1];}this.count++;this.lowestCount = 0;this.items[0] = element;}}addBack(element) {this.items[this.count] = element;this.count++;}removeFront() {if (this.isEmpty) {return undefined;}const result = this.items[this.lowestCount];delete this.items[this.lowestCount];this.lowestCount++;return result;}removeBack() {if (this.isEmpty) {return undefined;}this.count--;const result = this.items[this.count];delete this.items[this.count];return result;}peekFront() {if (this.isEmpty) {return undefined;}return this.items[this.lowestCount];}peekBack() {if (this.isEmpty) {return undefined;}return this.items[this.count - 1];}isEmpty() {return this.size() === 0;}size() {return this.count - this.lowestCount;}clear() {this.items = {};this.count = 0;this.lowestCount = 0;}toString() {if (this.isEmpty()) {return '';}let objString = `${this.items[this.lowestCount]}`;for (let i = this.lowestCount + 1; i < this.count; i++) {objString = `${objString},${this.items[i]}`;}return objString;}}
