读【数据结构与算法】之队列

基本实现

队列也是一种列表,他只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,先进先出,而栈是后入先出的。

队列主要有两种操作:向队列中插入新元素以及删除队列中元素。插入操作也叫入队,删除操作也叫出队。入队在队尾插入新元素,而出队则是删除队首的元素。

下边的是简单实现:

/**
 * Class Queue
 * 队列 Queue
 */

function Queue() {
	this._list = []; // 用于存储数据的数组
}

Queue.prototype = {

	constructor: Queue,

	/**
	 * 向队尾添加一个新元素
	 * @param  {Any} element 新元素
	 * @return {Undefined}   undefined
	 */
	enqueue: function enqueue(element) {
		this._list.push(element);
	},

	/**
	 * 取出队首元素
	 * @return {Any} 队首元素
	 */
	dequeue: function dequeue() {
		return this._list.shift();
	},

	/**
	 * 返回队首元素
	 * @return {Any} 队首元素
	 */
	front: function front() {
		return this._list[0];
	},

	/**
	 * 返回队尾元素
	 * @return {Any} 队尾元素
	 */
	back: function back() {
		return this._list[this._list.length - 1];
	},

	/**
	 * 返回队列的所有的元素
	 * @return {String} 结果字符串
	 */
	toString: function toString() {
		var ret = '';
		for (var i = 0, len = this._list.length; i < len; i++) {
			ret += this._list[i] + '\n';
		}
		return ret;
	},

	/**
	 * 判断队列是否为空
	 * @return {Boolean} 是否为空
	 */
	empty: function empty() {
		return !this._list.length;
	}

};

具体运行例子请看demojs实现队列Queue

利用队列可以对数据进行排序

有一种排序叫基数排序,这个排序的大概过程就是:

对于0~99的数字,这种排序将会扫描2次,如果是0~999的数字,将会是3次了。第一次按照个位上的排序,第二次按照十位上的数字排序;如果有更多位的话,以此类推。

每一个位上的数字肯定是0~9的,这里假定有10个队列分别对应,所以,对于每一个数字,每次按照不同位来排的时候,如果该位上的数字是n,那么就往第n个队列中添加他。

然后,在根据队列顺序,将每一个队列的结果按顺序一个一个的排列就好了。

/**
 * 根据相应位(个位或十位)上的数值,将数字分配到相应队列函数中
 * @param  {Array}  nums   数字组成数组
 * @param  {Array}  queues 队列组成数组
 * @param  {Number} n      长度
 * @param  {Number} digit  个位1或者十位10
 * @return {Undefined}      undefined
 */
function distribute(nums, queues, n, digit) {
	for (var i = 0; i < n; i++) {
		if (digit == 1) {
			queues[nums[i] % 10].enqueue(nums[i]);
		} else {
			queues[Math.floor(nums[i] / 10)].enqueue(nums[i]);
		}
	}
}

/**
 * 从队列中收集数字
 * @param  {Array} queues 队列数组
 * @param  {Array} nums   数字数组
 * @return {Undefined}     undefined
 */
function collect(queues, nums) {
	for (var i = 0, digit = 0; digit < 10; digit++) {
		while (!queues[digit].empty()) {
			nums[i++] = queues[digit].dequeue();
		}
	}
}

具体运行例子请看demojs利用队列排序

发布于: 2014年 09月 05日