手写 实现一个队列

225 阅读1分钟
function Queue() {
  // 私有变量 items 用于记录数组,
  let items = []
  // 入队
  this.enqueue = function (element) {
    items.push(element)
  }
  // 出队
  this.dequeue = function () {
    return items.shift()
  }
  // 查看队列的第一个元素
  this.front = function () {
    return items[0]
  }
  // 查看队列是否为空
  this.isEmpty = function () {
    return items.length === 0
  }
  // 查看队列的长度
  this.size = function () {
    return items.length
  }
  // 将数组转为字符串并放回
  this.toString = function () {
    return items.toString()
  }
}

module.exports = Queue
  • 测试
var queue = new Queue();
expect(queue.isEmpty()).toBeTruthy();
queue.enqueue('张三');
queue.enqueue('李四');
queue.enqueue('王五');
expect(queue.front()).toBe('张三');
expect(queue.toString()).toBe('张三,李四,王五');
expect(queue.size()).toBe(3);
expect(queue.isEmpty()).toBeFalsy();
queue.dequeue();
queue.dequeue();
expect(queue.toString()).toBe('王五');
  • 加优先级
var priorityQueue = new PriorityQueue();
priorityQueue.enqueue('张三', 2);
priorityQueue.enqueue('李四', 1);
priorityQueue.enqueue('王五', 3);
expect(priorityQueue.toString()).toBe('李四-1,张三-2,王五-3');

优先级

function PriorityQueue() {
  let items = [];

  // 利用构造器函数创建队列元素
  let QueueElement = function(element, priority) {
    this.element = element;
    this.priority = priority
  }

  this.enqueue = function(element, priority) {
    let queueElement = new QueueElement(element, priority);

    // 张三的情况
    if (this.isEmpty()) {
      items.push(queueElement);
    } else {
      let added = false
      for (let i = 0; i < items.length; i++) {
        if (queueElement.priority < items[i].priority) {
          items.splice(i, 0, queueElement)
          added = true
          break
        }
      }
      // 王五的情况
      if (!added) {
        items.push(queueElement)
      }
    }
  }

  ...
  
  this.toString = function () {
    let string = ''
    for (let i = 0; i < items.length; i++) {
      string += items[i].element + '-' + items[i].priority + (items.length - i > 1 ? ',' : '')
    }
    return string
  }
}

module.exports = PriorityQueue;

链接:JavaScript实现队列 - 掘金 (juejin.cn)