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

本文深入探讨了队列数据结构的基本概念,包括其先进先出(FIFO)特性,并详细介绍了队列的主要操作如入队、出队、读取队头元素等。此外,文章还提供了使用JavaScript实现队列的具体代码示例,以及队列在基数排序和优先队列场景中的应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列

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<this.dataStore.length;i++){
        retStr+=this.dataStore[i]+"\n";
    }
    return retStr;
}

判断队列是否为空:

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<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 优先队列
  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());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值