LeetCode :150. 逆波兰表达式求值(含求后缀表达式和中缀转后缀表达式)

devtools/2024/11/8 11:17:27/

目录

题目描述:

代码:

拓展:

中缀表达式转后缀表达式代码:


题目描述:

给你一个字符串数组 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

代码:

   public int evalRPN(String[] tokens){//数组长度是变化的LinkedList<Integer> stack = new LinkedList<>();//java自带的栈  容量自动变化for(String i:tokens){if(i.equals("+")){int a = stack.pop();int b = stack.pop();stack.push(a+b);}else if(i.equals("-")){int a = stack.pop();int b = stack.pop();stack.push(b-a);}else if(i.equals("*")){int a = stack.pop();int b = stack.pop();stack.push(a*b);}else if(i.equals("/")){int a = stack.pop();//a
//                System.out.println(a);int b = stack.pop();//13System.out.println(b);stack.push(b/a);}else {stack.push(Integer.parseInt(i));//转换为int类型}}return stack.pop();}

拓展:

中缀表达式转后缀表达式代码:

package 表达式;import java.util.LinkedList;public class InfixToSuffix {// 中缀表达式转后缀表达式/* a+b   ab+*  a*b-c  ab*c-*  a+b*c   abc*+* 1.遇到非字符串,直接拼串* 2.遇到运算符  判断优先级,* 如果优先级高,则直接入栈,* 否则,>= 将栈内元素出栈,拼接 再入栈* 左括号直接入栈, 右括号把遇到左括号前的所有符号都出栈* 遍历完成,栈里剩余运算符 依次出栈拼接* */public static void main(String[] args) {
//        String exp = "a+b*c";
//        String exp = "1+2*3-4/5";String exp = "1+2*3-4/5*(6+7)";System.out.println(infixToSuffix(exp));}//判断优先级  +- 1  * / 2static int priority(char c) {switch(c){case '(':return 0;case '+':case '-':return 1;case '*':case '/':return 2;default:return -1;}}// 中缀表达式转后缀表达式static String infixToSuffix(String exp){LinkedList<Character> stack = new LinkedList<>();StringBuilder sb = new StringBuilder(exp.length());for(int i=0;i<exp.length();i++){char c = exp.charAt(i);switch(c){case '+':case '-':case '*':case '/':{if(stack.isEmpty()){//栈为空,直接入栈stack.push(c);break;}else{if(priority(c)>priority(stack.peek())) {//栈顶运算符优先级低stack.push(c);break;}else{while(!stack.isEmpty()&&priority(c)<=priority(stack.peek())){//栈顶运算符优先级高或相等sb.append(stack.pop());}stack.push(c);//通过前面对比,把优先级高或相等的先拼接,之后再把优先级低的运算符入栈break;}}}case '(':stack.push(c);break;case ')':{while(!stack.isEmpty()&&stack.peek()!='('){sb.append(stack.pop());}stack.pop();//左括号弹出break;}default:{sb.append(c);break;}}}while(!stack.isEmpty()){sb.append(stack.pop());}return sb.toString();}
}


http://www.ppmy.cn/devtools/132294.html

相关文章

adb 命令查看设备存储占用情况

有时会要用adb 命令查看设备存储占用情况。 一般使用df、du 命令去排查。但要注意 adb shell 和linux中的命令参数是有些区别的。 可以通过du --help 看支持哪些参数。 下面是在Android 下测试成功的指令。 首先df 查看整体占用分布情况。 假设要排查/data 目录下的文件占用…

Python网络爬虫:入门与实战

Python网络爬虫&#xff1a;入门与实战 引言 在当今信息爆炸的时代&#xff0c;如何从海量的互联网数据中提取有价值的信息&#xff0c;成为了许多开发者和数据分析师面临的重要课题。网络爬虫&#xff08;Web Crawler&#xff09;作为一种自动化工具&#xff0c;能够按照预…

大数据治理:构建数据驱动的智能未来

一、引言 背景介绍 随着信息技术的快速发展和互联网的普及&#xff0c;大数据已经成为现代社会的重要资产。企业和组织通过收集和分析大量数据来优化决策、提高效率和创新能力。然而&#xff0c;数据的快速增长也带来了一系列挑战&#xff0c;如数据质量、数据安全和隐私保护等…

CAA 二次开发 —— 创建批处理应用

本文使用批处理方式连接 3DE 服务器创建会话来简单介绍批处理应用的创建方法。 目录 1、创建步骤&#xff08;Step-by-Step&#xff09; 1.1 新建 Module 1.2 新建 Class 1.3 编写 Class 源文件 1.4 添加模块和框架依赖 1.5 编译运行 1、创建步骤&#xff08;Step-…

【K8S系列】Kubernetes Pod节点CrashLoopBackOff 状态及解决方案详解【已解决】

在 Kubernetes 中&#xff0c;Pod 的状态为 CrashLoopBackOff 表示某个容器在启动后崩溃&#xff0c;Kubernetes 尝试重启该容器&#xff0c;但由于持续崩溃&#xff0c;重启的间隔时间逐渐增加。下面将详细介绍 CrashLoopBackOff 状态的原因、解决方案及相关命令的输出解释。 …

基于SSM+微信小程序的社团登录管理系统(社团1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 2、项目技术 3、开发环境 4、功能介绍 1、项目介绍 基于SSM微信小程序的社团登录管理系统实现了管理员及社团、用户。 1、管理员实现了首页、用户管理、社团管理、社团信息管理、社…

MySQL 8.0在windows环境安装及配置

文章目录 一、下载二、安装三、配置环境变量 一、下载 1、先彻底卸载之前的MySQL&#xff0c;并清理其 残留文件 。 2、登录网址https://www.mysql.com/ 3、点击网址左下角“中文”按钮&#xff0c;切换到中文界面 4、点击网页上方的“下载”按钮&#xff0c;然后点击网页…

【C/C++】strncpy函数的模拟实现

零.导言 之前我们学习了strncpy函数&#xff0c;不妨我们现在尝试模拟实现strncpy函数的功能。 一.实现strncpy函数的要点 strncpy函数是一种字符串函数&#xff0c;可以按字节拷贝字符类型的数组&#xff0c;因此我们自定义的模拟函数需要两个char类型的指针参数&#xff1b;…