隊列是一種先進先出(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);