队列(Queue)是一种先进先出(First-In-First-Out, FIFO)的数据结构,与栈不同的是,它操作的元素是在两端,而且进行的是不一样的操作。向队列的队尾加入一个元素叫做入队列(enQueue)**,向队列的队首删除一个元素叫做出队列(delQueue)**.

ADT

Queue
---
length,属性,队列长度
dataStore,属性,存储数据
enQueue,方法,入队列
delQueue,方法,出队列
empty,方法,清空队列
front,方法,获得队首元素
rear,方法,获得队尾元素
print,方法,打印队列

JavaScript 描述

// 构造函数
function Queue() {
  this.length = 0;
  this.dataStore = [];
}
// 原型核心方法
Queue.prototype = {
  constructor: Queue,
  enQueue: function (element) {
    // 存储元素并使队列长度加1
    this.dataStore[this.length++] = element;
  },
  delQueue: function () {
    var res = this.dataStore[0], //取得队首元素
      i;

    // 当队列不为空
    if (res !== undefined) {
      // 这里尽量避免使用js语言特性来实现
      // 取出队首元素,并让队列后方元素向前移动,队列长度减一
      // js数组其实已经实现了队列的方法,删除队首shift
      if (this.length > 1) {
        for (i = 0; i < this.length - 1; i++) {
          this.dataStore[i] = this.dataStore[i + 1];
        }
        this.dataStore.length -= 1;
      } else {
        // 当只有一个元素时,出队列后数组为空
        this.dataStore = [];
      }
      this.length -= 1;
    }

    return res;
  },
};
// 其他方法
empty: function () {
    this.dataStore.length = 0;
    this.length = 0;
},
front: function () {
    return this.dataStore[0];
},
rear: function () {
    return this.dataStore[this.length - 1];
},
print: function () {
    for (var i = 0; i < this.length; i++) {
        console.log(this.dataStore[i] + '\n');
    }
}

测试

var q = new Queue();
q.enQueue('jiavan');
q.enQueue('jiavan2');
q.enQueue('jiavan3');
q.enQueue('jiavan4');
q.print();
q.delQueue(); // jiavan
q.length; // 3
q.front(); //jiavan2
q.rear(); // jiavan4
q.empty();
q.dataStore; //[]

系列文章原文地址https://github.com/Jiavan/js4algs GitHub repo 上有源码和更好的阅读体验,若有错误欢迎发 PR,若对你有所帮助也欢迎 star!