;(function () { function Array_h(length) { this.array = length === undefined ? [] : new Array(length); } Array_h.prototype = { /** * 返回数组长度 * * @return {Number} length [数组长度] */ length: function () { return this.array.length; }, at: function (index) { return this.array[index]; }, set: function (index, obj) { this.array[index] = obj; }, /** * 向数组的末尾添加一个或多个元素,并返回新的长度。 * * @param {*} obj [description] * @return {Number} length [新数组的长度] */ push: function (obj) { return this.array.push(obj); }, /** * 返回数组中选定的元素 * * @param {Number} start [开始索引值] * @param {Number} end [结束索引值] * @return {Array} newArray [新的数组] */ slice: function (start, end) { return this.array = this.array.slice(start, end); }, concat: function (array) { this.array = this.array.concat(array); }, remove: function (index, count) { count = count === undefined ? 1 : count; this.array.splice(index, count); }, join: function (separator) { return this.array.join(separator); }, clear: function () { this.array.length = 0; } }; /** * 先进先出队列 (First Input First Output) * * 一种先进先出的数据缓存器 */ var Queue = function () { this._array_h = new Array_h(); }; Queue.prototype = { _index: 0, /** * 排队 * * @param {Object} obj [description] * @return {[type]} [description] */ push: function (obj) { this._array_h.push(obj); }, /** * 出队 * * @return {Object} [description] */ pop: function () { var ret = null; if (this._array_h.length()) { ret = this._array_h.at(this._index); if (++this._index * 2 >= this._array_h.length()) { this._array_h.slice(this._index); this._index = 0; } } return ret; }, /** * 返回队列中头部(即最新添加的)的动态对象 * * @return {Object} [description] */ head: function () { var ret = null, len = this._array_h.length(); if (len) { ret = this._array_h.at(len - 1); } return ret; }, /** * 返回队列中尾部(即最早添加的)的动态对象 * * @return {Object} [description] */ tail: function () { var ret = null, len = this._array_h.length(); if (len) { ret = this._array_h.at(this._index); } return ret; }, /** * 返回数据队列长度 * * @return {Number} [description] */ length: function () { return this._array_h.length() - this._index; }, /** * 队列是否为空 * * @return {Boolean} [description] */ empty: function () { return (this._array_h.length() === 0); }, clear: function () { this._array_h.clear(); } }; exports.Queue = Queue; }());