当前位置: 首页 > news >正文

【leetcode150】逆波兰表达式求值Java代码讲解

12.26 150. 逆波兰表达式求值

首先要理解什么是逆波兰表达式

逆波兰表达式:

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

  • 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )
  • 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )

逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*''/'
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

示例 1:

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2:

输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

示例 3:

输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:该算式转化为常见的中缀算术表达式为:((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();int n = tokens.length;for(int i = 0; i < n;i++){if(isNum(tokens[i]) == false){//因为先出栈的是后来进栈的元素,所以先出栈的一定是在+-*/的右边这个数int num2 = stack.pop(); int num1 = stack.pop();switch (tokens[i]) {case "+":stack.push(num1 + num2);break;case "-":stack.push(num1 - num2);break;case "*":stack.push(num1 * num2);break;case "/":stack.push(num1 / num2);break;default:}}else{stack.push(Integer.parseInt(tokens[i]));}}return stack.pop();}public boolean isNum(String s){if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")){return false;}else{return true;}}
}

相关文章:

  • vue大屏-列表自动滚动vue-seamless-scroll
  • mysql二进制对应ef中实体表字段类型
  • git 学习 之一个规范的 commit 如何写
  • 构建创新学习体验:企业培训系统技术深度解析
  • 【Java EE初阶四】锁及synchronized关键字
  • Java正则表达式
  • 「Verilog学习笔记」超前进位加法器
  • CUDA驱动深度学习发展 - 技术全解与实战
  • 五分钟学会SQL:基础入门
  • 探索Apache Commons Imaging处理图像
  • 华为云服务器重启后无法连接故障解决
  • C/S医院检验LIS系统源码
  • Android 13 - Media框架(28)- MediaCodec(三)
  • 如何快速删除pdf周围的空白
  • PLC远程上下载物联网网关的功能
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • C语言笔记(第一章:C语言编程)
  • download使用浅析
  • JavaScript创建对象的四种方式
  • Java超时控制的实现
  • mockjs让前端开发独立于后端
  • redis学习笔记(三):列表、集合、有序集合
  • 前端知识点整理(待续)
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 温故知新之javascript面向对象
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 最简单的无缝轮播
  • (03)光刻——半导体电路的绘制
  • (2)STM32单片机上位机
  • (Python第六天)文件处理
  • (solr系列:一)使用tomcat部署solr服务
  • (ZT)出版业改革:该死的死,该生的生
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (新)网络工程师考点串讲与真题详解
  • (转)C#调用WebService 基础
  • (转)德国人的记事本
  • .net core 6 集成和使用 mongodb
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .Net程序帮助文档制作
  • @selector(..)警告提示
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [exgcd] Jzoj P1158 荒岛野人
  • [HJ56 完全数计算]
  • [HJ73 计算日期到天数转换]
  • [IE编程] 了解Urlmon.dll和Wininet.dll
  • [iOS]如何删除工程里面用cocoapods导入的第三方库
  • [JavaEE系列] Thread类的基本用法