逆波兰式求值 —Java
首先我们了解一下什么叫逆波兰表达式?
逆波兰式,也叫后缀表达式(即运算符写在操作数之后)
例: 9 3 /
而我们日常所用的表达式都是中缀表达式,与逆波兰式是不一样的
上述的逆波兰式可能大家已经知道了,用中缀表达式表述:9 / 3
下面我们来试试稍微复杂一点的中缀式转逆波兰式吧!!!
中缀式:1. (2+3) / 5 2. 5 / (3+7) 3. (9+3) * 2 4. (10+3) * ((3+5) / 2)
逆波兰式:1. 2 3 + 5 /2. 5 3 7 + /3. 9 3 + 2 *4. 3 10 + 3 5 + 2 / *
发现没,所有的中缀式转逆波兰式其实是有优先级的,拿中缀式 (2+3) /5 来说转逆波兰式之后就是 2 3 + 5 /了,那么如果是 2+3/5 呢?
2+3/5的逆波兰式就是 2 3 5 / +
大家可以仔细想想为什么不一样?
是因为在 2+3/5这个表达式里,先运算的是3/5,而在(2+3) /5里,先运算的2+3。优先级不同所以最后的逆波兰式也是不一样的。
public class Main{//逆波兰表达式求值public static void main(String[] args) {String[] tokens={"10","6","9","3","+","-11","*","/","*","17","+","5","+"};int res=Integer.MAX_VALUE;for(int i=0;i<tokens.length;i++){int operator=isOperator(tokens[i]);if(operator==-1)continue;int num1=isNum(tokens,i);int num2;//第一次运算时,num1应与num2调换,再寻找下一位符号位更近的数字//例: 9 3 / num1:9 num2:3 operator:/if(res==Integer.MAX_VALUE){num2=num1;num1=isNum(tokens,i);}else num2=res;if(operator==1)res=num1+num2;else if(operator==2)res=num1-num2;else if(operator==3)res=num1*num2;else if(operator==4)res=num1/num2;}System.out.println(res);}//判断是否为运算符static int isOperator(String str){if(str=="+")return 1;if(str=="-")return 2;if(str=="*")return 3;if(str=="/")return 4;return -1;}//返回离符号最近的数字static int isNum(String[] str,int index){while(index>=0){if(Character.isDigit(str[index].charAt(0))){int val= Integer.parseInt(str[index]);str[index]=".";return val;}index--;}return 0;}
}
逆波兰式求值 —Java相关推荐
- java逆波兰式求值_波兰式、逆波兰式与表达式求值
波兰式.逆波兰式是<数据结构>课程中讲解关于栈的时候提到的,栈是很简单的一种数据结构.但是这些理论的提出却是计算机早期发展领域的重大突破,值得仔细回味. 1. 中缀表达式 我们在数学中学到 ...
- 【Java版oj】逆波兰表达式求值
目录 一.原题再现 二.问题分析 三.完整代码 一.原题再现 150. 逆波兰表达式求值 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除 ...
- 数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6
括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现,这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现) 逆波兰表达式求值问题(点我 ...
- 代码随想录第11天 | LeetCode20. 有效的括号、LeetCode1047. 删除字符串中的所有相邻重复项、LeetCode150. 逆波兰表达式求值
day11 | LeetCode20. 有效的括号.LeetCode1047. 删除字符串中的所有相邻重复项.LeetCode150. 逆波兰表达式求值 文章目录 day11 | LeetCode20 ...
- 算法训练第十一天|力扣20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
20. 有效的括号 题目链接:有效的括号 参考:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B ...
- 逆波兰表达式求值(leetcode 150)
文章目录 1.问题描述 2.难度等级 3.热门指数 4.解题思路 5.实现示例 5.1 C++ 5.2 Golang 参考文献 1.问题描述 逆波兰表达式也叫后缀表达式. 有效的算符包括 +.-.*. ...
- JavaScript逆波兰表达式求值
逆波兰表达式简介 逆波兰表达式又叫做后缀表达式.逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasiewicz)于1929年首先提出的一种表达式的表示方法 .后来,人们就把用这种表示法写出的表 ...
- LetCode: 150. 逆波兰表达式求值
提示 LintCode中的相关算法题实现代码,可以在我的GithHub中下载. 题目需求 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另 ...
- 复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值
栈和队列的概念 栈:吃进去吐出来 对列:吃进去拉出来 数据结构中的栈和内存中的区别 数据结构中的栈具有后进先出的特性,而内存中的栈是一个内存空间,只不过这个内存空间具与数据结构的栈具有相同的特性. 栈 ...
最新文章
- Java 抽象方法和抽象类基础知识
- 学习构建WDF驱动程序 - 初步了解SOURCE和makefile文件
- 计算机网络利用率是什么_当我们在谈论高并发的时候究竟在谈什么?
- openlayers小车_openlayer 车辆跟着轨迹移动
- java session 生命周期_java之hibernate之session中对象的生命周期
- windows 下eclipse 连HBASE
- 数据可视化工具的特点有哪些
- STM32CubeMX使用(四)之DMA方式使用ADC
- 阻止 Mac 进入睡眠模式保持清醒的 5 种方法
- CPU制造工艺完整过程(图文)
- STM32 易阅读的代码风格
- android 使用ffmpeg 调用命令实现视频转gif(ffmpeg 学习三)
- eclipse JRebel破解
- Axure _ 原型图
- mysql-repeatable read可以避免幻读
- 2021全国大学生数学建模竞赛论文格式规范
- 海报分享功能实现详解
- 机器视觉问题:工业普通定焦镜头如何计算景深?景深计算
- 关于archlinux的使用
- Unity 编辑器批量修改Prefab