队列,FIFO(First Input First Output) 一种先进先出的数据缓存器。

(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)
	 * 
	 * 一种先进先出的数据缓存器
	 */
	function Queue(){
		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();
		}
	};



	var queue = new Queue();

	queue.push('one');
	queue.push('two');
	queue.push('three');
	
	console.log(queue.head());// three
	console.log(queue.tail());// one
	console.log(queue.length());// 3

	queue.pop();

	console.log(queue.head());// three
	console.log(queue.tail());// two
	console.log(queue.length());// 2

	queue.clear()//清空队列数据

	console.log(queue.head());// null
	console.log(queue.tail());// null
	console.log(queue.length());// -1
})();