队列
1 什么是队列
队列是一种列表,具有先进先出(FIFO)的特点。可用于模拟提交操作系统执行的一系列进程、打印任务,顾客排队行为等。
2 对队列的操作
- 入队(插入新元素)
- 出队(删除元素)
- 读取队头元素
- 读取队列长度 length
- 清空队列 clear()
3 实现队列
用数组模拟。
- 实现Queue类,先从构造函数开始。
function Queue(){
this.dataStore=[];
this.enqueue=enqueue;
this.dequeue=dequeue;
this.front=front;
this.back=back;
this.toString=toString;
this.empty=empty;
}
enqueue向队列中添加一个元素:
function enqueue(element){
this.dataStore.push(element);
}
dequeue删除队首的元素:
function dequeue(){
return this.dataStore.shift();
}
读取队首和队尾的元素:
function front(){
return this.dataStore[0];
}
function back(){
return this.dataStore[this.dataStore.length-1];
}
toString()显示队列内所有元素:
function toString(){
var retStr="";
for(var i=0;i<this.dataStore.length;i++){
retStr+=this.dataStore[i]+"\n";
}
return retStr;
}
判断队列是否为空:
function empty(){
return this.dataStore.length===0;
}
4 队列运用
4.1 基数排序
思想:
- 取出将要排序的数,按照个位放入0-9这10个队列
- 取出排序过一次的数,按照十位放入0-9这10个队列
- 按照0-9的顺序读取出队列中的数,即为排序结果
思路:
- 数组num[]存储所有数
- 构造10个队列queue
- 构造将数放入队列的函数 此处要区分按照个位还是十位
- 构造将数从队列中取出的函数
实现:
function putInQueue(queues,nums,base){
for(var i=0;i<nums.length;i++){
if(base==1){
queues[nums[i]%10].enqueue(nums[i]);
}else if(base==10){
queues[Math.floor(nums[i]/10)].enqueue(nums[i]);
}
}
return queues;
}
function takeFromQueue(queues){
var nums=[];
var index=0;
for(var i=0;i<queues.length;i++){
while(!queues[i].empty()){
nums[index++]=queues[i].dequeue();
}
}
return nums;
}
var nums=[];
var queues=[];//存放队列的数组
for (var i = 0; i < 10; ++i) {
nums[i] = Math.floor(Math.random() * 101);//0-100之间的随机整数 包括0和100
}
for(var i=0;i<10;i++){
queues[i]=new Queue();
}
var queues=putInQueue(queues,nums,1);
var oneCircle=takeFromQueue(queues);
console.log(oneCircle);
var queues=putInQueue(queues,nums,10);
var twoCircle=takeFromQueue(queues);
console.log(twoCircle);
4.2 优先队列
- 思想:优先级更高的元素更早出队,优先级相同的情况下按照先来后到顺序。模拟急诊科就医顺序。
- 实现:《数据结构与算法JavaScript描述》一书中存在部分不当,dequeue()函数中priority和元素位置应该用两个变量存储。
function Patient(name, code) {
this.name = name;
this.code = code;
}
function dequeue() {
var priority = this.dataStore[0].code;
var flag;
for (var i = 1; i < this.dataStore.length; ++i) {
if (this.dataStore[i].code < priority) {
priority = this.dataStore[i].code;
flag=i;
}
}
return this.dataStore.splice(flag,1);
}
function toString() {
var retStr = "";
for (var i = 0; i < this.dataStore.length; ++i) {
retStr += this.dataStore[i].name + " code: "
+ this.dataStore[i].code + "\n";
}
return retStr;
}
var p = new Patient("Smith",5);
var ed = new Queue();
ed.enqueue(p);
p = new Patient("Jones", 4);
ed.enqueue(p);
p = new Patient("Fehrenbach", 6);
ed.enqueue(p);
p = new Patient("Brown", 1);
ed.enqueue(p);
p = new Patient("Ingram", 1);
ed.enqueue(p);
console.log(ed.toString());
var seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ")
console.log(ed.toString());
// 下一轮
var seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ")
console.log(ed.toString());
var seen = ed.dequeue();
console.log("Patient being treated: " + seen[0].name);
console.log("Patients waiting to be seen: ")
console.log(ed.toString());