js实现一个队列,模拟击鼓传花,回文检查器

145 阅读1分钟

队列: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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;
}