java数据结构与算法刷题-----LeetCode150. 逆波兰表达式求值

leetcode150:逆波兰表达式求值 tokens[i] 是一个算符(“+”、“-”、“*” 或 “/”),或是在范围 [-200, 200] 内的一个整数。解题思路:用一个栈来存储里面的每一个元素,这里面的元素如果是符号,分为加法,减法,乘法,除法,如果是加法、乘法,a。输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,“输入:tokens = [“4”,“13”,“5”,“/”,“+”]输入:tokens = [“2”,“1”,“+”,“3”,“*”]有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 本题也叫后缀表达式,更利于机器处理
  2. 题目给出的案例都是正确的后缀表达式,因此我们无需考虑很多出错情况
  3. 只要后缀表达式正确,那么我们只要遇到数字就放入栈中,遇到操作符就进行操作,则都会遵循:
  1. 每遇到一个操作符,栈中一定有两个数字,这两个数字就是参与运算的操作数
  2. 所有操作符运算完成后,栈中一定剩下一个数字,就是最终表达式的结果
  3. 每处理一个操作符,会从栈中取出两个元素进行操作,然后将结果放回栈
抽象成为二叉树

在这里插入图片描述
在这里插入图片描述

代码
  1. 用栈直接模拟
    在这里插入图片描述
class Solution {
    //非递归版本
    public int evalRPN(String[] tokens) {
        int n = tokens.length;
        int stack[] = new int[(n+1)/2];//数组模拟栈,只需要一半大小的栈,因为本质上是一课二叉树
        int top = -1;//栈顶指针
        for(int i = 0;i < n; i++){//遍历数组
            String token = tokens[i];//获取当前元素
            switch(token){
                case "+"://如果是+操作
                    top--;//取出两个数字,然后相加,然后在放回栈。因此top只需减一次
                    stack[top]+=stack[top + 1];//模拟栈顶两个元素相加,放回栈顶
                    break;//结束本次操作
                case "-"://剩余都和+操作相同
                    top--;
                    stack[top] -= stack[top + 1];
                    break;
                case "*":
                    top--;
                    stack[top] *= stack[top + 1];
                    break;
                case "/":
                    top--;
                    stack[top] /= stack[top + 1];
                    break;
                default://如果是数字就放入栈中
                    top++;
                    stack[top] = Integer.parseInt(token);
            }//end_switch
        }//end_for
        return stack[top];//最后后缀表达式的结果一定是栈顶元素。
    }
}
  1. 抽象为二叉树进行深度优先遍历,dfs
    在这里插入图片描述
class Solution {
    String[] tokens;//将tokens保存到公共中,递归时可以直接使用
    int cur;//二叉树指针
    public int evalRPN(String[] tokens) {
        this.tokens = tokens;
        cur = tokens.length - 1;//指针初始指向最后一个字符,也就是根结点
        return dfs(); //进行dfs
    }

    public int dfs() {
        String token = tokens[cur--];//拿到当前结点
        switch(token) {//如果是操作符,左右孩子如果是数字就进行运算
            case "+" -> {return dfs() + dfs();}
            case "*" -> {return dfs() * dfs();}
            case "-" -> {
                int right = dfs();
                int left = dfs();
                return left - right;
            }
            case "/" -> {
                int right = dfs();
                int left = dfs();
                return left / right;
            }
            //如果当前不是操作符,就把数字返回,让其参与运算
            default -> {return Integer.valueOf(token);}
        }
    }
}
【中等】力扣算法题解析LeetCode150:逆波兰表达式求值 本文介绍了使用栈结构计算逆波兰表达式的方法。逆波兰表达式是一种后缀表示法,运算符位于操作数之后,适合用栈处理。解题思路是遍历输入字符串数组,遇到数字入栈,遇到运算符则弹出栈顶两个元素进行运算,结果重新入栈。关键点包括操作数顺序处理(减法、除法需注意)、数组模拟栈优化性能,以及整数除法向零截断。最终栈中剩余的唯一元素即为表达式结果。代码实现使用数组模拟栈,时间复杂度O(n),空间复杂度O(n/2)。提交结果显示该方法高效可靠。 阅读详情

相关推荐

考虑风和浪的影响的旋筒帆船航线优化方法研究

针对旋筒帆船进行航线优化的实现方法,包括升阻力系数的数值模拟、升阻力系数的多元非线性回归建模、旋筒帆船6DOF摇荡运动建模分析以及考虑风、浪影响的旋筒帆船的航线优化研究。

m0_63225885的博客 1164

刷题-CC150-Java实现

8.1 1.1 字符串互异 确定一个字符串的所有字符是否全都不同。 方法一:逐字符比较的方法。时间复杂度:O(n2)。 import java.util.*; public class Different { public boolean checkDifferent(String iniString) { // write code here

GarfieldEr007的专栏 1100

Android逆向实战:抖音聊天记录数据库解析与导出(附完整SQL查询)

本文提供了一份Android逆向实战指南,详细解析了抖音聊天记录数据库的结构与导出方法。通过定位核心的`im.db`数据库文件,深度解读conversation_list、msg等关键表结构,并附上完整的SQL查询语句,帮助开发者或研究人员安全、合规地提取和分析本地聊天数据,适用于移动安全研究与数据分析场景。

mango的博客 860

【LeetCode刷题日记】150.逆波兰表达式求值

本文介绍了逆波兰表达式(后缀表达式)的计算方法。逆波兰表达式通过将运算符置于操作数之后,消除了括号需求且运算顺序明确。解题关键在于使用栈结构:遇到数字入栈,遇到运算符则弹出栈顶两个元素进行运算并将结果重新入栈。特别要注意除法和减法的操作数顺序问题(先弹出的是右操作数)。文章提供了Java实现代码,演示了如何处理加减乘除运算,同时强调了字符串比较应使用equals()方法而非==运算符。这种栈处理方法与二叉树后序遍历原理相通,是计算机科学中表达式求值的经典算法。

任岁月风干理想再也找不回真的我 1119

【ESP32】1.编译、烧录、创建工程

本文介绍了在VSCode中搭建ESP32开发环境并烧录"Hello World"工程的过程。首先通过串口工具成功下载固件后,解决了OpenOCD报错问题。针对头文件无法识别的问题,修改了c_cpp_properties.json配置文件,调整了编译器路径和IntelliSense模式。文章还详细说明了创建新工程的步骤,包括选择芯片型号和项目模板,并验证了串口打印功能。最后提醒在项目构建时要等待完成,避免文件缺失。整个流程涵盖了环境搭建、代码烧录、调试及新项目创建等关键环节。

梁山1号 1485

排队论在食堂窗口规划中的应用:M/M/S模型优化案例

本文通过食堂窗口规划的真实案例,详细阐述了如何运用排队论中的M/M/S模型量化服务效率。文章从问题拆解、数据采集、模型计算到成本效益分析,提供了完整的数学建模实战指南,帮助读者掌握利用最优化方法解决资源配置问题的核心流程与工具。

docker7nomad的博客 1085

力扣刷题日记之150.逆波兰表达式求值

今天继续给大家分享一道力扣的做题心得今天这道题目是 150.逆波兰表达式求值题目如下,题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation 这道题说是一道中等难度的题目,其实如果理解了其中的含义,实际上比简单题还要稍微简单一些,废话不多说我们直接开始分析题目, 这道题最核心的含义就是通过将这个String类型的数组中的数和运算符号按照其运算规则算完然后返回最后算出来的那个值就可以了,仔细看这个运算规则

ymr1843762281的博客 619

S32K344 Flash Driver实战:手把手教你实现任意字节写入与扇区解锁(含C40_Ip避坑指南)

本文深入解析S32K344微控制器的Flash驱动开发,重点解决C40_Ip驱动库的8字节对齐限制和扇区保护锁问题。通过实战案例和代码示例,详细介绍了如何实现任意字节写入、扇区解锁及性能优化策略,为Bootloader和OTA升级等应用提供可靠解决方案。

weixin_33713707的博客 432

力扣(逆波兰表达式求值)

摘要: LeetCode 150题要求计算逆波兰表达式值。该表达式天然适配栈结构:遇到操作数入栈,遇到运算符则弹出栈顶两个元素(注意顺序)计算后将结果入栈。关键点在于:1)减法和除法需区分操作数顺序;2)除法需向零截断。算法通过遍历tokens数组,利用栈实现运算,时间复杂度O(n),空间复杂度O(n)。代码采用ArrayDeque优化栈操作,并通过字符串长度快速识别运算符提升效率。

weixin_52811458的博客 1021

YOLO + SubspaceAD:一张良品图,检出所有未知缺陷

当YOLO遇上子空间建模,工业质检正迎来从“见多识广”到“举一反三”的质变时刻。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 501

YOLOv13添加轻量化的EMA模块Faster_EMA,轻量又涨点!map50提升4.56个点,召回率提升9.66!

本文介绍了YOLOv13模型的优化移植方法,通过添加Faster_EMA模块和超参数调整,使模型性能显著提升。主要修改包括:1) 创建新的模型配置文件yolov13-Faster_EMA.yaml;2) 在tasks.py中添加新模块;3) 修改__init__.py和block.py文件,新增Partial_conv3和DropPath类。优化后模型mAP50提升4.56%,召回率提升9.66%,验证了改进方案的有效性。代码实现了局部卷积和随机深度等先进技术,为YOLO系列模型性能优化提供了新思路。

FJN110的博客 2606

LeetCode题练习与总结:逆波兰表达式求值--150

本文详细介绍了如何使用栈数据结构来解决逆波兰表达式的求值问题。通过遍历给定的字符串数组,对每个元素进行判断和处理,最终得到表达式的计算结果。文章中还分析了算法的时间复杂度和空间复杂度,并总结了涉及到的关键知识点。

一直学习永不止步 1037

2023年电工杯 | 2023年电工杯数学建模竞赛思路(A题、B题)

2023年电工杯 | 2023年电工杯数学建模竞赛思路(A题、B题)

前程算法屋的博客 5593

LeetCode 150:逆波兰表达式求值

LeetCode 150:逆波兰表达式求值 题目描述解题思路代码实现总结 题目描述 根据逆波兰表示法,求表达式的值。 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 1: 输入: [“2”, “1”, “+”, “3”, ...

香农三定律的博客 310

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode 150. 逆波兰表达式求值

给你一个字符串数组tokens,表示一个根据表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。'+''-''*''/'9该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 96该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 622该算式转化为常见的中缀算术表达式为:= 17 + 5= 22"+""-""*""/"逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

m0_56090828的博客 449

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

150. 逆波兰表达式求值(栈与队列算法题)

【摘要】本文介绍了如何利用栈结构求解逆波兰表达式(后缀表达式)的值。逆波兰表达式的特点是运算符位于操作数之后,如"2 1 + 3 *"等价于中缀表达式(2+1)*3=9。解题时使用栈存储操作数,遇到运算符则弹出栈顶两个元素进行运算并将结果压栈。Java实现中需注意:字符串比较用equals()方法,数字转换用Integer.valueOf(),整数除法需截断。该算法时间复杂度为O(n),空间复杂度为O(n),是处理无括号表达式的高效方法。

m0_68880377的博客 838

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

算法题 逆波兰表达式求值

本文介绍了逆波兰表达式(后缀表达式)的求值方法。通过使用栈数据结构,可以高效地计算表达式的值。算法遍历表达式元素,遇到数字压栈,遇到运算符则弹出两个操作数进行运算并将结果压回栈中。提供了两种实现:使用Stack类和数组模拟栈,后者性能更优。时间复杂度O(n),空间复杂度O(n)。示例演示了算法执行过程,如输入["2","1","+","3","*"]得到9,符合((2+1)*3)的结果。

红血哥 867

逆波兰表达式求值(LeetCode第150题)java实现

一、题目描述 根据逆波兰表示法,求表达式的值。 有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例1: 输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2 + 1) * 3) =...

alan_gaohaodong的博客 660

数据结构详解之栈(含Java实现+力扣低/中难度刷题实战)

本文系统介绍了栈(Stack)这一基础数据结构。首先阐述了栈的核心特性"后进先出"(LIFO),列举了函数调用、表达式求值等典型应用场景。接着详细讲解了数组和链表两种实现方式,并提供了Java代码示例。文章重点通过4道力扣题目(2低+2中难度)进行实战演练:包括有效的括号、用队列实现栈、逆波兰表达式求值和每日温度问题,每道题都给出了解题思路、完整代码和详细解析。最后总结了栈的核心知识点,并给出进阶学习建议,帮助读者掌握栈的基本概念和应用技巧。

2303_79635409的博客 1219

Java题目详解——LeetCode150.逆波兰表示式求值

具体来说,我们在遍历字符串数组时,如果遇到的是操作数,那么就将其压入栈中,如果遇到的是操作符,那么就从栈中取出两个操作数(注意顺序,会影响减法和除法的结果)进行操作,并将结果再压入栈中,最后遍历完成后,取出栈中的结果(此时只有一个元素,就是结果)并返回即可。输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]可以保证给定的逆波兰表达式总是有效的。输入:tokens = ["2","1","+","3","*"]

lil_ghost_的博客 530

LeetCode150——逆波兰表达式求值

我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/description/ 题目描述: 知识点:逆波兰表达式求值、栈 思路:逆波兰表达式求值 逆波兰表达式的计算规则: 从左往右遍历表达式的...

清风阁 527

java-代码随想录第十一天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

本文介绍了LeetCode中的三道算法题解。150题逆波兰表达式求值使用栈结构处理运算符和操作数,通过栈顶元素运算得到结果。239题滑动窗口最大值采用双端队列维护单调队列,确保每次获取窗口内最大值。347题前K个高频元素使用哈希表统计频率,再通过小根堆(优先队列)筛选出前K个高频元素。三题分别考察了栈、队列和堆的应用,涉及数据结构转换、单调性维护和优先级排序等算法技巧。其中后两题难度较高,建议至少理解解题思路。

qq_57465625的博客 965

【力扣算法】150-逆波兰表达式求值

题目 根据逆波兰表示法,求表达式的值。 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 1: 输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2 + 1) * 3) = 9 示例 ...

ZeromaXHe的博客 506

关于力扣150题目——逆波兰表达式求值Java实现的三种解法

本文将介绍三种不同的Java实现方法来解决这个问题。这种解法使用递归来实现逆波兰表达式的求值,通过一个指针来遍历表达式数组,每次递归处理一个运算符或操作数,直至整个表达式求值完成。类的开销,第三种解法则使用了递归的方法,较为巧妙。在实际应用中,可以根据具体情况选择合适的实现方式来达到更好的性能和可读性。这是最直观和常见的解法,使用栈来存储操作数,并在遇到运算符时从栈中弹出操作数进行计算,然后将结果压入栈中。由于逆波兰表达式求值只需要后进先出的特性,我们也可以使用数组来模拟栈的操作,从而避免使用Java的。

2301_77695569的博客 829

Java实现 LeetCode 150 逆波兰表达式求值

150. 逆波兰表达式求...

292

【LeetCode每日一题】——150.逆波兰表达式求值

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 栈 二【题目难度】 中等 三【题目编号】 150.逆波兰表达式求值 四【题目描述】 根据 逆波兰表示法,求表达式的值。 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0

IronmanJay 348
上一篇: java数据结构与算法刷题-----LeetCode1047. 删除字符串中的所有相邻重复项
下一篇: java数据结构与算法刷题-----LeetCode239. 滑动窗口最大值
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值