JavaScript 構造隊列

隊列是一種先進先出(First-In-First-Out,FIFO)的數據結構。
隊列的兩種主要操作是:向隊列中插入新元素和刪除隊列中的元素。
插入操作也叫做入隊,刪除操作也叫做出隊。入隊操作在隊尾插入新元素,出隊操作刪除隊頭的元素。

function Queue() {
	this.dataStore = [];
	this.enqueue = enqueue;
	this.dequeue = dequeue;
	this.front = front;
	this.back = back;
	this.toString = toString;
	this.empty = empty;
}

// 入隊
function enqueue(element) {
	this.dataStore.push(element);
}

// 出隊
function dequeue() {
	return this.dataStore.shift();
}

// 查詢隊首元素
function front() {
	return this.dataStore[0];
}

// 查詢隊尾元素
function back() {
	return this.dataStore[this.dataStore.length-1];
}

// 輸出隊列中每個元素
function toString() {
	var retStr = "";
	for (var i = 0; i < this.dataStore.length; ++i) {
		retStr += this.dataStore[i] + "\n";
	}
	return retStr;
}

// 查詢隊列是否爲空
function empty() {
	if (this.dataStore.length == 0) {
		return true;
	}
	else {
		return false;
	}
}

測試例子:

var names = "F Allison McMillan  M Frank Opitz  M Mason McMillan  M Clayton Ruff  F Cheryl Ferenback  M Raymond Williams  F Jennifer Ingram  M Bryan Frazer  M David Durr  M Danny Martin  F Aurora Adney";

// 讀取列表,按性別分類,入隊
function getDancers(man,fman){
	var nas = names.split("  ");
    for(var i=0;i<nas.length;i++){
        var dan = nas[i].split(' ');
        var sex = dan[0];
        var name = dan[1];
        if(sex != 'F'){
            man.enqueue(new Dancer(name,sex));
        }else {
            fman.enqueue(new Dancer(name,sex));
        }
    }
}

function Dancer(name,sex) {
	this.name = name;
	this.sex = sex;
}


// 配對,出隊
function dance(males,females){
    console.log("Thedancepartnersare:\n");
    while(!females.empty()&&!males.empty()){
        person=females.dequeue();
        console.log("Femaledanceris:"+person.name);
        person=males.dequeue();
        console.log("andthemaledanceris:"+person.name);
    }
}

var maleDancers=new Queue();
var femaleDancers=new Queue();
getDancers(maleDancers,femaleDancers);
dance(maleDancers,femaleDancers);

if (!femaleDancers.empty()) {
	console.log(femaleDancers.front().name + " is waiting to dance.");
}
if (!maleDancers.empty()) {
	console.log(maleDancers.front().name + " is waiting to dance.");
}

----->
Thedancepartnersare:

VM2180:26 Femaledanceris:Allison
VM2180:28 andthemaledanceris:Frank
VM2180:26 Femaledanceris:Cheryl
VM2180:28 andthemaledanceris:Mason
VM2180:26 Femaledanceris:Jennifer
VM2180:28 andthemaledanceris:Clayton
VM2180:26 Femaledanceris:Aurora
VM2180:28 andthemaledanceris:Raymond
VM2180:42 Bryan is waiting to dance.

使用隊列排列數字的例子:

// 傳入數據數組,臨時存儲的隊列,進制和比較的位數,根據位數的數字將數字傳入對應的隊列中
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]);
		}
	}
}

// 提取所有隊列中的數字,並刪除隊列中的數字
function collect(queues, nums) {
	var i = 0;
	for (var digit = 0; digit < 10; ++digit) {
		while (!queues[digit].empty()) {
			nums[i++] = queues[digit].dequeue();
		}
	}
}

// 輸出結果
function dispArray(arr) {
	var arrStr = '';
	for (var i = 0; i < arr.length; ++i) {
		arrStr += arr[i] + ' ';
	}
	console.log(arrStr);
}

// 主程序
var queues = [];
// 定義十個臨時存儲的隊列
for (var i = 0; i < 10; ++i) {
	queues[i] = new Queue();
}
var nums = [];
for (var i = 0; i < 10; ++i) {
	nums[i] = Math.floor(Math.floor(Math.random() * 101));
}
console.log("Before radix sort: ");
dispArray(nums);
distribute(nums, queues, 10, 1);
collect(queues, nums);
distribute(nums, queues, 10, 10);
collect(queues, nums);
console.log("\n\nAfter radix sort: ");
dispArray(nums);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章