队列: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
class Queue {
constructor() {
this.count = 0;
this.lowstcount = 0;
this.items = {}
}
enQueue(ele) {
this.items[this.count] = ele;
this.count++
}
deQueue() {
if(this.isEmpty()) {
return undefined
}
let res = this.items[this.lowstcount];
delete this.items[this.lowstcount];
this.lowstcount++;
return res
}
peek() {
if(this.isEmpty()) {
return undefined
}
return this.items[this.lowstcount];
}
isEmpty() {
return this.count - this.lowstcount === 0;
}
size() {
return this.count - this.lowstcount
}
clear() {
this.items = {}
this.count = 0;
this.lowstcount = 0;
}
toString() {
if(this.isEmpty()) {
return ''
}
let str = `${this.items[this.lowstcount]}`
let i = this.lowstcount + 1;
while (i < this.count) {
str = `${str},${this.items[i]}`
i++
}
return str;
}
}
双端队列:
class dq {
constructor() {
this.count = 0;
this.lowstcount = 0;
this.items = {}
}
isEmpty() {
return this.count - this.lowstcount === 0;
}
size() {
return this.count - this.lowstcount
}
clear() {
this.items = {}
this.count = 0;
this.lowstcount = 0;
}
toString() {
if(this.isEmpty()) {
return ''
}
let str = `${this.items[this.lowstcount]}`
let i = this.lowstcount + 1;
while (i < this.count) {
str = `${str},${this.items[i]}`
i++
}
return str;
}
addFront(ele) {
if(this.isEmpty()) {
this.items[this.count] = ele;
this.count++
} else if (this.lowstcount > 0) {
this.lowstcount--;
this.items[this.lowstcount] = ele;
} else {
this.lowstcount--;
this.items[this.lowstcount] = ele;
}
}
addBack(ele) {
this.items[this.count] = ele;
this.count++
}
removeFront() {
if(this.isEmpty()) {
return undefined
}
let res = this.items[this.lowstcount];
delete this.items[this.lowstcount];
this.lowstcount++;
return res
}
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.lowstcount];
}
peekBack() {
if (this.isEmpty()) {
return undefined
}
return this.items[this.count - 1];
}
}
双端队列模拟击鼓传花游戏:
function hotPotato(elementList, num) {
let queue = new Queue();
let elimitedList = [];
for (let i = 0; i < elementList.length; i++) {
queue.enQueue(elementList[i]);
}
while(queue.size()>1) {
for(let i=0; i<num; i++) {
queue.enQueue(queue.deQueue())
}
elimitedList.push(queue.deQueue())
}
return {
elimited: elimitedList,
lastone: queue.deQueue()
}
}
双端队列实现回文检查器:
function palindromeChecker(aString) {
if (aString === undefined || aString === null || (aString !== null && aString.length === 0)) {
return false
}
const queue = new dq();
const lowerString = aString.toLocaleLowerCase().split(' ').join('');
let isEqual = true;
let firstChar, lastChar;
for (let i=0; i<lowerString.length; i++) {
queue.addBack(lowerString.charAt(i));
}
while(queue.size()>1 && isEqual) {
firstChar = queue.removeFront();
lastChar = queue.removeBack();
if (firstChar !== lastChar) {
isEqual = false
}
}
return isEqual;
}