【JavaScript数据结构与算法】队列

队列

1 什么是队列

队列是一种列表,具有先进先出(FIFO)的特点。可用于模拟提交操作系统执行的一系列进程、打印任务,顾客排队行为等。

2 对队列的操作

  • 入队(插入新元素)
  • 出队(删除元素)
  • 读取队头元素
  • 读取队列长度 length
  • 清空队列 clear()

3 实现队列

用数组模拟。

  1. 实现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

判断队列是否为空:

function empty(){
    return this.dataStore.length===0;
}

4 队列运用

4.1 基数排序

思想:

  1. 取出将要排序的数,按照个位放入0-9这10个队列
  2. 取出排序过一次的数,按照十位放入0-9这10个队列
  3. 按照0-9的顺序读取出队列中的数,即为排序结果

思路:

  1. 数组num[]存储所有数
  2. 构造10个队列queue
  3. 构造将数放入队列的函数 此处要区分按照个位还是十位
  4. 构造将数从队列中取出的函数
    实现:
function putInQueue(queues,nums,base){
    for(var i=0;i

4.2 优先队列

  1. 思想:优先级更高的元素更早出队,优先级相同的情况下按照先来后到顺序。模拟急诊科就医顺序。
  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());

你可能感兴趣的:(【JavaScript数据结构与算法】队列)