JavaScript:栈和对列

news2024/9/17 7:11:48

文章目录

  • 栈和对列
    • Js 有栈与队列吗
    • 20. 有效的括号 - 力扣(LeetCode)
      • 思路
    • 1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
      • 思路
      • 代码分析
      • array.join() 操作打印
      • const s of str 操作遍历
    • 150. 逆波兰表达式求值 - 力扣(LeetCode)
      • 思路
      • 代码分析
      • js:isNaN()
      • JavaScript 位运算符 |

栈和对列

Js 有栈与队列吗

[图片]

JavaScript 没有内置的栈和队列数据结构,但可以使用数组来模拟它们。

  1. 栈(Stack)
    栈是一种后进先出(LIFO)的数据结构。可以使用数组来实现栈,使用 push() 方法向栈顶添加元素,使用 pop() 方法弹出栈顶元素。
    push() 方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。而 pop() 方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。
    例如:
    [图片]
// 入栈出栈---先进后出
const stack = [];

stack.push(1);
stack.push(2);
stack.push(3);

console.log(stack.pop()); // 3
console.log(stack.pop()); // 2
console.log(stack.pop()); // 1
  1. 队列(Queue)
    队列是一种先进先出(FIFO)的数据结构。可以使用数组来实现队列,使用 push() 方法向队尾添加元素,使用 shift() 方法弹出队头元素。
    例如:
    [图片]
// 入队出队---先进先出
const queue = [];

queue.push(1);
queue.push(2);
queue.push(3);

console.log(queue.shift()); // 1
console.log(queue.shift()); // 2
console.log(queue.shift()); // 3

需要注意的是,使用数组实现队列时,使用 shift() 方法弹出队头元素的时间复杂度为 O(n),因为需要将数组中所有元素向前移动一位。如果需要高效地实现队列,可以使用双端队列(deque)或循环队列(circular queue)。unshift()方法是向数组的开头添加一个或多个元素,并且返回新的长度。

20. 有效的括号 - 力扣(LeetCode)

思路

在这里插入图片描述

代码分析

/*
 * @lc app=leetcode.cn id=20 lang=javascript
 *
 * [20] 有效的括号
 */

// @lc code=start
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
/* 
        如果是左括号,就把相应的右括号,push压入栈
        如果是右括号,就弹出当前栈的末尾元素pop,如果匹配,继续上述操作,不匹配返回false
        当遍历完所有的字符,栈里面位空,则返回true
     */
    /**
     * eg  ([(){}])
     * 技巧:我们匹配左括号的时候,可以让右括号入栈,这样就只需要比较当前元素和栈顶元素是否相等
     */
    // 1 建一个栈 数组
    const stack = []
    // 2 遍历字符串
    for(let i = 0; i < s.length; i++) {
        // 判断当前的括号是否是左括号,是左括号,入栈(push()),最后入的就是栈顶元素
        switch (s[i]) {
            case '(':
                stack.push(')')
                break;
            case '[':
                stack.push(']')
                break;
            case '{':
                stack.push('}')
                break;
            default:
                // 右括号,如果跟栈顶元素(pop())不相等,false
                if(s[i] !== stack.pop())
                return false
        }
    }
    // 当元素遍历完了,栈为空,那么返回true
    return stack.length === 0
};
// @lc code=end

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

思路

在这里插入图片描述

代码分析

/*
 * @lc app=leetcode.cn id=1047 lang=javascript
 *
 * [1047] 删除字符串中的所有相邻重复项
 */

// @lc code=start
/**
 * @param {string} s
 * @return {string}
 */
var removeDuplicates = function(s) {
    /**
     * 删除相邻相同的字符,重复删除直至无法删除(入栈出栈)
     */
    // 1 创建栈
    const stack = []
    // 2 遍历字符串
    for(const x of s) {
        // 使用c记录弹出的元素是否与当前遍历元素一样,不一样需要把c压回栈中
        let c = null
        // 3 栈不为空,且当前的字符 === 弹出的字符 跳出循环继续遍历
        if(stack.length && x === (c = stack.pop())) continue
        // 4 当前字符和弹出字符不一致时,且c存在(栈空的时候不存在),我们把c继续压入栈中,继续进行匹配
        c && stack.push(c)
        // 5 如果弹出字符没有与当前字符x相等,则把当前的x压入栈
        stack.push(x)
    }
    // 6 返回当前栈 且去掉分隔符
    return stack.join("")
};
// @lc code=end

array.join() 操作打印

[图片]
[图片]

const s of str 操作遍历

[图片]

150. 逆波兰表达式求值 - 力扣(LeetCode)

思路

在这里插入图片描述

代码分析

/*
 * @lc app=leetcode.cn id=150 lang=javascript
 *
 * [150] 逆波兰表达式求值
 */

// @lc code=start
/**
 * @param {string[]} tokens
 * @return {number}
 */
var evalRPN = function(tokens) {
    /**
     * 逆波兰:后序遍历,我们需要得到正常的表达式(中序遍历,左根右)来计算
     * 思路:遇到数字,入栈,遇到符号,我们就弹出两个数字n2,n1,进行计算,再把结果压入栈,之后继续判断是否遇到数字还是符号
     */
    // 1 创建栈
    const stack = []
    // 2 遍历字符串
    for(const token of tokens) {
        // 3 如果是数字(需要把字符串强制转成数字类型),压入栈
        if(!isNaN(Number(token))) {
            stack.push(Number(token))
        }else {
            // 4 不是数字,弹出两个数字,判断符号,再进行运算,结果压入栈,继续判断是否是数字
            const n2 = stack.pop()
            const n1 = stack.pop()
            switch (token) {
                case '+':
                    stack.push(n1 + n2)
                    break;
                case '-':
                    stack.push(n1 - n2)
                    break;
                case '*':
                    stack.push(n1 * n2)
                    break
                case '/':
                    // 取整操作 | 0 保留整数部分
                    // stack.push(n1 / n2 | 0)
                    stack.push(parseInt(n1/n2))
                    break
                default:
                    break;
            }
        }
    }
    // 5 直到最后计算完全部,压入的最后一个值,就是最终结果
    return stack[0]

};
// @lc code=end

js:isNaN()

JavaScript isNaN() 函数
isNaN()是JavaScript中的一个函数,用于检查一个值是否是非数字NaN(Not a Number)。
语法:
isNaN(value)
参数:
value:需要检查的值。
返回值:
如果value是NaN,返回true;否则返回false。
示例:

isNaN(123) // false
isNaN('123') // false
isNaN('hello') // true
isNaN('') // false
isNaN(null) // false
isNaN(undefined) // true
isNaN(NaN) // true

注意:如果参数不是数值类型,isNaN()会尝试将其转换为数值类型,如果无法转换,则返回true。例如,字符串'hello'无法转换为数值类型,所以isNaN('hello')返回true。

JavaScript 位运算符 |

JavaScript 运算符 | 菜鸟教程
JavaScript 取整函数_js 取整_不见舟的博客-CSDN博客
javascript位运算技巧(有点错误可在控制台检测)
[图片]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(1)QT基础铺垫

目录 1.Qt特性 2. 新建项目 3. 工作目录与构建目录 4. 工作目录 4.1 .pro 项目配置文件 4.2 dialog.h 4.3 dialog.cpp 4.4 main.cpp 5. 帮助文档 6. 调试信息 1.Qt特性 Qt经常被当作是一个基于c语言的gui开发框架&#xff0c;但是这并不是qt的全部&#xff0c;除了开…

助力工业物联网,工业大数据之ODS层构建:申明分区代码及测试【十】

文章目录 知识点13&#xff1a;ODS层构建&#xff1a;申明分区代码及测试知识点14&#xff1a;ODS层与DWD层区别知识点15&#xff1a;DWD层构建&#xff1a;需求分析知识点16&#xff1a;DWD层构建&#xff1a;建库实现测试知识点17&#xff1a;DWD层构建&#xff1a;建表实现测…

Packet Tracer – 研究 VLAN 实施

Packet Tracer – 研究 VLAN 实施 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 S1 VLAN 99 172.17.99.31 255.255.255.0 不适用 S2 VLAN 99 172.17.99.32 255.255.255.0 不适用 S3 VLAN 99 172.17.99.33 255.255.255.0 不适用 PC1 NIC 172.17.10.2…

Linux部署Gitlab/上传项目

一、提前准备 1.1安装依赖工具 yum install -y curl policycoreutils-python openssh-serversystemctl start sshd systemctl enable sshd 1.2安装Postfix邮件服务器 #安装 postfix yum install -y postfix#启动 postfix 并设置为开机启动 systemctl enable postfix systemctl …

HashCode与String大家庭

当金钱站起来说话时&#xff0c;所有的真理都保持了沉默&#xff1b;金钱一旦作响&#xff0c;坏话随之戛然而止。 Hashcode的作用 java的集合有两类&#xff0c;一类是List&#xff0c;还有一类是Set 前者有序可重复&#xff0c;后者无序不重复。当我们在set中插入的时候怎…

Vue传参${id}变成$%7Bid%7D

发生缘由 外卖项目在Linux服务器上面运行发送请求乱码 运行环境 电脑系统&#xff1a;win10jdk版本&#xff1a;jdk-8SpringBoot版本&#xff1a;v2.4.5MP版本&#xff1a;3.4.2Vue版本&#xff1a;Vue.js v2.6.12Linux版本&#xff1a;Centos7 报错信息 // 修改页面反查详…

MES系统中的BOM为何如此重要?先进的BOM体系怎么构建?

其实不管有没有数字化&#xff0c;BOM都是制造企业的灵魂纽带&#xff0c;对于产品繁多、流程冗长的工业企业来说&#xff0c;如果BOM管理不规范&#xff0c;必然对生产效率和产品质量带来巨大的隐患&#xff0c;因此在工业企业的数字化转型之路中&#xff0c;建立科学规范的BO…

Blender 建模练习-锁链

目录 1.1.1 贝塞尔圆1.2 阵列修改器1.3 阵列修改器 物体偏移1.4 添加贝塞尔曲线1.5 曲线修改器 1. 本次练习主要使用到阵列修改器、贝塞尔曲线、空物体 1.1 贝塞尔圆 把贝塞尔圆进行缩放&#xff0c;然后在物体数据属性|几何数据|倒角|设置倒角深度为0.05 1.2 阵列修改器 …

【数据结构】二叉树(详细)

二叉树 1.树1.1定义1.2基本术语1.3树形结构和线性结构1.4树的存储结构1.4.1双亲表示法1.4.2孩子兄弟表示法 2.二叉树2.1定义2.2特殊二叉树2.3性质2.4存储结构2.4.1顺序存储2.4.2链式存储结构 3.二叉树的基本操作3.1前序遍历&#xff08;先序遍历&#xff09;3.2中序遍历3.3后序…

开放原子训练营(第三季)inBuilder低代码开发实验室---报销单录入系统

作为一名低代码初学者&#xff0c;我使用inBuilder系统设计了一款报销单录入系统&#xff0c;实现了报销单录入与显示报销单列表的功能&#xff08;如图1与图2所示&#xff09;&#xff0c;并获得了很多开发心得。从inBuilder系统的优点、缺点以及开发过程三方面出发&#xff0…

go继承nacos配置中心并读取配置信息

配置中心 为什么需要配置中心 平时我们写一个demo的时候&#xff0c;或者说一个单体的应用&#xff0c;都会有一个配置文件&#xff0c;不管是 json文件或者yaml文件&#xff0c;里面包含了redis,mysql,es等信息&#xff0c;如果我们修改了配置文件&#xff0c;往往我们需要重…

和Ai一起学习CMake(一)

和Ai一起学习CMake 现在人工智能爆火&#xff0c;ChatGPT、new bing等层出不穷。我们借助Ai来学习一下CMake。下面是我与Ai的问答&#xff0c;这个学习主要是通过Ai来学习&#xff0c;但是防止Ai乱说话&#xff0c;我会结合自身的知识和实际操作给出相应的补充。 我的环境如下…

玄子Share - Tomcat 9 安装配置教程(含安装包)

玄子Share - Tomcat 9 安装配置教程&#xff08;含安装包&#xff09; 下载 下载链接 官网 https://tomcat.apache.org/ 下载教程 进入 Tomcat 官网&#xff0c;点击左侧导航栏&#xff0c;选择需要的版本下载。这里按照课程要求选择tomcat 9的版本 Mirrors&#xff1a;选…

为什么越来越多的企业开始选择云计算?

一、前言 随着数字化时代的到来&#xff0c;企业对于数据的需求越来越大&#xff0c;而传统的数据存储方式已经无法满足企业的需求。云计算作为一种新兴的技术&#xff0c;可以为企业提供更加灵活、高效、安全的数据存储和处理方式&#xff0c;因此越来越多的企业开始选择云计算…

element ui el-calendar日历组件使用总结

el-calendar日历组件使用总结 1. 需求说明2. 基础实现3. 只展示当月数据4. 动态切换日历里的数据实现5. 顺便把快捷方式隐藏了&#xff0c;不让用户选择上一个月下一个月 1. 需求说明 按月显示&#xff0c;每次只显示一个月的日期&#xff0c;其余隐藏 日历组件的显示时间随着…

数值分析-牛顿插值公式

目录 一、引言 二、牛顿插值公式的基本概念 1.插值问题 2.插值多项式 3.牛顿插值公式 三、牛顿插值公式的推导过程 四、牛顿插值公式的应用 1.图像处理 2.信号处理 五、牛顿插值公式的优缺点 1. 优点 2. 缺点 六、总结 一、引言 在数值分析中&#xff0c;插值是一…

干掉复杂的Java工具类,Hutool 工具库确实香~

Hutool 大家已经比较熟悉了&#xff0c;这是一个超全的 Java 工具库&#xff0c;深受国内开发者的喜爱。 我之前其实是不太喜欢使用这种功能太多的工具类的&#xff0c;也比较担心稳定性和安全性&#xff0c;后面慢慢接受了就感觉其实也还好。而且&#xff0c;我们还可以按需只…

如何优雅地停掉线程?

很久很久以前&#xff0c;在一个名为“Springboot”的村庄中&#xff0c;住着一群热爱编程的程序员。他们喜欢探索新技术、优化自己的代码&#xff0c;为了打造更好的软件而不断努力着。 在这个村庄中&#xff0c;有一个名叫小明的程序员&#xff0c;他是村庄中最优秀的程序员…

等概率随机函数设计技巧

文章目录 1. 关于Math.random()函数2. 用1 ~ 5的随机函数加工出1 ~ 7的随机函数3. LeetCode 470. 用 Rand7() 实现 Rand10()4. 把不等概率随机函数变成等概率随机函数5. 用a ~ b的随机函数加工出c ~ d的随机函数 1. 关于Math.random()函数 Java 中 Math.random() 函数是等概率…

微服务和领域驱动

一、微服务 1.1 什么是微服务 微服务就是一些协同工作的小而自治的服务。 关键词&#xff1a; 小而自治 -- 小 “小”这个概念&#xff0c;一方面体现在微服务的内聚性上。 内聚性也可以称之为单一职责原则&#xff1a;“把因相同原因而变化的东西聚合到一起&#xff0c;…