【js版数据结构学习之队列】

一、简要认识队列

结构:一种特殊的线性表
入队:在队尾插入一个元素
出队:在队头删除一个元素
特点:先入先出
空队列:队中没有元素

二、队列的封装

class Queue {
   
    items = {
   }
    count = 0
    lowCount = 0

    dequeue() {
   
        if(this.isEmpty()){
   
            return undefined
        }
        let res = this.items[this.lowCount]
        delete this.items[this.lowCount]
        this.lowCount++
        return res
    }

    enqueue(data) {
   
        this.items[this.count] = data
        this.count++
    }

    front() {
   
        return this.items[this.lowCount]
    }

    isEmpty() {
   
        return this.size() === 0
    }

    size() {
   
        return this.count-this.lowCount
    }

    clear() {
   
        this.items = {
   }
        this.count = 0;
        this.lowCount = 0
    }

    toString() {
   
        let str = ""
        for(let i =this.lowCount;i<this.count;i++){
   
            str += `${
     this.items[i]} `
            }
        return str
    }
}

三、队列的应用

1.栈和队列的转换

在这里插入图片描述

class MyStack {
   
 constructor() {
   
   this.queue1 = [];
   this.queue2 = [];
 }

 push(x) {
   
   // 将元素加入非空队列
   if (this.queue1.length === 0) {
   
     this.queue2.push(x);
   } else {
   
     this.queue1.push(x);
   }
 }

 pop() {
   
   if (this.empty()) {
   
     throw new Error("Stack is empty!");
   }

   // 将非空队列中的元素转移到辅助队列中,直到剩余一个元素
   const nonEmptyQueue = this.queue1.length === 0 ? this.queue2 : this.queue1;
   const emptyQueue = this.queue1.length === 0 ? this.queue1 : this.queue2;
   while (nonEmptyQueue.length > 1) {
   
     emptyQueue.push(nonEmptyQueue.shift());
   }

   // 取出最后一个元素并返回
   return nonEmptyQueue.shift();
 }

 top() {
   
   if (this.empty()) {
   
     throw new Error("Stack is empty!");
   }

   // 将非空队列中的元素转移到辅助队列中,直到剩余一个元素
   const nonEmptyQueue = this.queue1.length === 0 ? this.queue2 : this.queue1;
   const emptyQueue = this.queue1.length === 0 ? this.queue1 : this.queue2;
   while (nonEmptyQueue.length > 1) {
   
     emptyQueue.push(nonEmptyQueue.shift());
   }

   // 取出最后一个元素并返回
   const top = nonEmptyQueue.shift();
   emptyQueue.push(top);
   return top;
 }

 empty() {
   
   return this.queue1.length === 0 && this.queue2.length === 0;
 }
}

2.全排列

在这里插入图片描述

function permute(nums) {
   
 const result = [];
 const queue = [[]]; // 初始队列中只有一个空数组

 while (queue.length > 0) {
   
   const current = queue.shift(); // 取出队列中的当前排列

   // 如果当前排列的长度等于原始数组的长度,说明找到了一种排列方式
   if (current.length === nums.length) {
   
     result.push(current);
     continue;
   }

   // 尝试将原始数组中剩余的数字加入到当前排列中
   for (let i = 0; i < nums.length; i++) {
   
     // 如果当前数字已经在排列中,跳过这个数字
     if (current.includes(nums[i])) {
   
       continue;
     }
     queue.push([...current, nums[i]]); // 将当前数字加入到排列中并加入队列
   }
 }

 return result;
}

3.任务调度

使用队列来管理需要异步执行的任务,确保它们按照顺序执行。

// 定义一个任务队列
const taskQueue = [];

// 添加任务到队列
function enqueueTask(task) {
   
  taskQueue.push(task);
}

// 执行队列中的任务
function processTasks() {
   
  while (taskQueue.length > 0) {
   
    const task = taskQueue.shift(); // 从队列头部取出任务
    task(); // 执行任务
  }
}

// 示例任务
function task1() {
   
  console.log('Task 1');
}

function task2() {
   
  console.log('Task 2');
}

function task3() {
   
  console.log('Task 3');
}

// 添加任务到队列
enqueueTask(task1);
enqueueTask(task2);
enqueueTask(task3);

// 执行任务队列
processTasks();

4.缓存管理

使用队列来管理数据的加载和展示,避免同时加载大量数据。

// 定义一个数据缓存队列
const dataQueue = [];

// 添加数据到队列
function enqueueData(data) {
   
  dataQueue.push(data);
}

// 展示队列中的数据
function showData() {
   
  while (dataQueue.length > 0) {
   
    const data = dataQueue.shift(); // 从队列头部取出数据
    console.log('Data:', data);
  }
}

// 添加数据到队列
enqueueData('Data 1');
enqueueData('Data 2');
enqueueData('Data 3');

// 展示数据队列
showData();

相关推荐

  1. 数据结构队列

    2024-01-20 13:10:03       46 阅读
  2. 数据结构队列

    2024-01-20 13:10:03       19 阅读
  3. 数据结构队列

    2024-01-20 13:10:03       10 阅读
  4. 数据结构队列学习

    2024-01-20 13:10:03       11 阅读
  5. 04 数据结构队列

    2024-01-20 13:10:03       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-20 13:10:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-20 13:10:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-20 13:10:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-20 13:10:03       20 阅读

热门阅读

  1. Spring中的注解

    2024-01-20 13:10:03       31 阅读
  2. Windows 常用快捷键

    2024-01-20 13:10:03       30 阅读
  3. 洛谷 P1622 释放囚犯【区间dp】

    2024-01-20 13:10:03       35 阅读
  4. 【卡梅德生物】如何制备纳米抗体?

    2024-01-20 13:10:03       29 阅读
  5. Git 的基本概念、使用方式及常用命令

    2024-01-20 13:10:03       37 阅读
  6. C++:通过ofstream写入二进制文件内容

    2024-01-20 13:10:03       38 阅读