双端队列跟队列的区别就是:队列只有一头进一头出,而双端队列两头都可以进可以出。灵活性变高,同样的也相对复杂。
class Deque {constructor() {this.count = 0;this.lowestCount = 0;this.items = {};}/*** 向队列前端添加元素* @param {*} element*/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.items[0] = element;}}/*** 向队尾添加新的项* @param {*} element*/addBack(element) {this.items[this.count] = element;this.count++;}/*** 移除队列第一项*/removeFront() {if (this.isEmpty()) {return;}let element = this.items[this.lowestCount];delete this.items[this.lowestCount];this.lowestCount++;return element;}/*** 移除队列最后一项*/removeBack() {if (this.isEmpty()) {return;}this.count--;let element = this.items[this.count];delete this.items[this.count];return element;}/*** 返回队列第一项*/peekFront() {return this.isEmpty() ? null : this.items[this.lowestCount];}/*** 返回队列最后一项*/peekBack() {return this.isEmpty() ? null : this.items[this.count];}isEmpty() {return this.size() === 0;}size() {return this.count - this.lowestCount;}clear() {this.count = 0;this.lowestCount = 0;this.items = {};}toString() {if (this.isEmpty()) {return '';}let str = this.items[this.lowestCount].toString();for (let i = this.lowestCount + 1; i < this.count; i++) {str += `,${this.items[i]}`;}return str;}}
