首页 > 其他分享 >JS 模拟 循环队列

JS 模拟 循环队列

时间:2023-06-27 15:11:35浏览次数:33  
标签:arr capacity 队列 frontIdx JS tailIdx new 模拟 size

 Loop Array 代码(基于JS原生数组)

/**
 * 循环队列
 */
var ALoopQueue = (function () {
    /**
     * @type {Array}
     */
    let arr;
    /**
     * 头节点
     * @type {number}
     */
    let frontIdx;
    /**
     * 尾节点
     * @type {number}
     */
    let tailIdx;
    /**
     * 元素数量
     * @type {number}
     */
    let size;

    /**
     * 
     * @param {number} new_capacity 
     */
    const resize = (new_capacity) => {
        const data = new Array(new_capacity + 1);
        const len = arr.length;
        for (let i = 0; i < size; i++) {
            data[i] = arr[(i + frontIdx) % len];
        }
        arr = data;
        frontIdx = 0;
        tailIdx = size;
    };

    /**
     * @class
     */
    class _ALoopQueue {
        /**
         * 构造器
         * @constructor
         * @param {number} capacity 
         */
        constructor(capacity = 10) {
            arr = new Array(capacity + 1);
            frontIdx = 0;
            tailIdx = 0;
            size = 0;
        }

        /**
         * 获取当前的数据容量
         * @returns 
         */
        get_capacity() {
            return arr.length - 1;
        }

        /**
         * 获取元素个数
         * @returns 
         */
        get_size() {
            return size;
        }

        /**
         * 当前容器是否为空
         * @returns 
         */
        is_empty() {
            return frontIdx === tailIdx;
        }

        /**
         * 入队操作
         * @param el 
         */
        enqueue(el) {
            // % 运算优先级高于 +
            if ((tailIdx + 1) % arr.length === frontIdx) {
                resize(this.get_capacity() * 2);
            }
            arr[tailIdx] = el;
            tailIdx = (tailIdx + 1) % arr.length;
            size++;
        }

        /**
         * 出队操作
         * @returns 
         */
        dequeue() {
            if (this.is_empty()) {
                throw new Error('队列为空,无法执行出队操作!');
            }
            const tar = arr[frontIdx];
            arr[frontIdx] = void 0;
            frontIdx = (frontIdx + 1) % arr.length;
            size--;
            const cap = this.get_capacity();
            if (size === Math.floor(cap / 4) && Math.floor(cap / 2) !== 0) {
                resize(Math.floor(cap / 2));
            }
            return tar;
        }

        /**
         * 获取头部元素
         * @returns 
         */
        get_front() {
            if (this.is_empty()) {
                throw new Error('队列为空!');
            }
            return arr[frontIdx];
        }

        /**
         * 获取数据的字符串描述
         * @returns 
         */
        to_string() {
            let str = 'Loop Queue: size=' + size + ', capacity=' + this.get_capacity() + '; front [';
            if (size > 0) {
                str += arr[frontIdx];
            }
            if (frontIdx < tailIdx) {
                for (let i = frontIdx + 1; i !== tailIdx; i = (i + 1) % arr.length) {
                    str += (',' + arr[i]);
                }
            }
            str += '] tail';
            return str;
        }
    }

    return _ALoopQueue;
})();

 

标签:arr,capacity,队列,frontIdx,JS,tailIdx,new,模拟,size
From: https://www.cnblogs.com/fanqshun/p/17466266.html

相关文章

  • SAP UI5 应用里 /sap/ui/thirdparty/datajs.js 的作用
    SAPUI5是一个基于JavaScript的用户界面技术,用于构建企业级应用程序。它是一个成熟的开源框架,由SAP开发,致力于提供高质量、可扩展和易于维护的Web应用程序。SAPUI5应用程序使用一系列技术和库,其中之一就是/sap/ui/thirdparty/datajs.js。在本文中,我们将详细讨论datajs.......
  • js正则匹配以$开头和结尾的内容,并改变颜色
     letres="$你好你好$"res=res.replace(/\$(?<=\$).*?(?=\$)\$/g,`<spanonclick="((params)=>{console.log(params)})('$&')"style="color:dodgerblue;padding:05px;"......
  • 模拟HTTP测试post请求与get请求方式的工作原理与抓包分析
    一,工作原理与简介HTTP请求是客户端向服务器发送请求的过程,常见的HTTP请求方法有GET和POST。如下图,HTTP新建请求过程(1)GET请求的工作原理是,客户端向服务器发送一个请求,请求中包含要获取的资源路径和参数,服务器根据路径和参数返回相应的资源。GET请求可以在URL中传递参数,参数以键......
  • JS(函数、作用域、预解析)
    一函数的概念在JS里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用。虽然for循环语句也能实现一些简单的重复操作,但是比较具有局限性,此时我们就可以使用JS中的函数。函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量......
  • B0626 模拟赛题解
    原题链接前言重庆一位金牌大佬出的。感受:除了最后一题,感觉难度不如C组,甚至没之前D组题难?T1浪费2.5h,最后还是打表秒了。T2想出正解,但发现是数据结构题,最后40min怒打100行,差点打出正解。T3花20min打出20分部分分,赛后发现XD秒了(tql)。T4看题浪费5min......
  • 【node.js】Node.js下载安装(在vscode中使用)01
    ......
  • css颜色变淡和变浅方法收集(模拟sass的darken和lighten函数)
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • Rabbitmq:消息队列介绍、Rabbitmq安装、 基于Queue实现生产者消费者模型、基本使用(生产
    目录一、消息队列介绍1.1介绍1.2MQ解决什么问题1.3常见消息队列及比较二Rabbitmq安装2.1服务端原生安装2.2服务端Docker安装2.3客户端安装2.4设置用户和密码三基于Queue实现生产者消费者模型四基本使用(生产者消费者模型)五消息安全之ack六消息安全之durable持久化七闲置消......
  • js-如何设置input只能输入数字
    如何设置input只能输入数字 方法一将<input>标签中的​type​属性直接设置为​number​就可以达到只能输入数字。但是这个方式有一个缺点,它只能作用于网页端,在手机输入的话还是可以输入汉字或英文:<inputtype="number"name="">方法二还是一样在<input>标签上设置,代码如......
  • js-关于数组中includes()的使用方法
    关于数组中includes()的使用方法1.includes简单介绍说明 1.includes()方法是用来判断一个数组是否包含一个指定的值,返回一个布尔值,如果是返回true,否则false。2.其中,includes(a,b)括号里第一个参数a为必选参数,表示要查找的某个参数;第二位b为可选参数,表示从某个索引位置开始......