力扣150(java)-逆波兰表达式求值(中等)
题目:
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 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
提示:
- 1 <= tokens.length <= 104
- tokens[i] 是一个算符("+"、"-"、"*" 或 "/"),或是在范围 [-200, 200] 内的一个整数
逆波兰表达式:
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
- 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
- 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波兰表达式主要有以下两个优点:
- 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
- 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
1.利用栈后进先出的特点进行模拟:
- 遍历输入的字符串;
- 遇到整数时,直接将整数压入栈中;
- 遇到操作符(+ - * /),就从栈顶依次弹出两个操作数与此时的操作符进行运算,并将运算结果作为操作数压入栈中,进行下一轮循环;
- 数组遍历完后,栈顶元素就是表达式的值,直接弹出栈顶元素进行返回即可。
代码:
1 class Solution {
2 public int evalRPN(String[] tokens) {
3 Deque<Integer> stack = new ArrayDeque<>();
4 for(String s : tokens){
5 if(s.equals("+")){
6 int num1 = stack.pop();
7 int num = num1 +stack.pop();
8 stack.push(num);
9 }else if(s.equals("-")){
10 int num1 = stack.pop();
11 int num = stack.pop() - num1;
12 stack.push(num);
13 }else if(s.equals("*")){
14 int num1 = stack.pop();
15 int num = num1 * stack.pop();
16 stack.push(num);
17 }else if(s.equals("/")){
18 int num1 = stack.pop();
19 int num = stack.pop() / num1;
20 stack.push(num);
21 }else{
22 stack.push(Integer.parseInt(s));
23 }
24 }
25 return stack.pop();
26 }
27 }

今天终于自己独立的看题目解出一道题并通过啦~
2023-05-24:
1 class Solution {
2 public int evalRPN(String[] tokens) {
3 Stack<Integer> stack = new Stack<>();
4 for (String s : tokens){
5 if (s.equals("+")){
6 stack.push(stack.pop() + stack.pop());
7 }else if (s.equals("-")){
8 stack.push(-stack.pop() + stack.pop());
9 }else if (s.equals("*")){
10 stack.push(stack.pop() * stack.pop());
11 }else if (s.equals("/")){
12 int temp1 = stack.pop();
13 int temp2 = stack.pop();
14 stack.push(temp2 / temp1);
15 }else {
16 stack.push(Integer.valueOf(s));
17 }
18 }
19 return stack.pop();
20 }
21 }
小知识:
Integer.valueOf(s)在Integer.parseInt(s)的计算的基础上,将int类型的数值转换成了Integer类型,就是基本类型的包装类型是引用类型。所以单单为了得到一个int值,就用Integer.parseInt(s)就行了。如果为了得到包装类型就用Integer.valueOf(s)。毕竟缓存了一部分数值,可以加强点儿性能。本题栈中存放是类型就是Integer,故这里需要使用Integer.valueOf(s)。
2.利用数组存放操作数来模拟栈实现:
思路跟上面一致,有几个可以改善的地方:
- 数组的长度可以设置成 tokens.length / 2 + 1,因为每两个操作数只需要一个操作符,操作数只需要 tokens.length / 2 + 1个长度就可以,例如[4,13,5]三个操作数只需要两个位置就可以了。
- 使用switc..case 代替 if...else if ...else 效率更优化
代码:
1 class Solution {
2 public int evalRPN(String[] tokens) {
3 int[] numStack = new int[tokens.length /2 + 1];
4 int index = 0;
5 for(String s : tokens){
6 switch(s){
7 case "+":
8 numStack[index - 2] += numStack[--index];
9 break;
10 case "-":
11 numStack[index - 2] -= numStack[--index];
12 break;
13 case "*":
14 numStack[index - 2] *= numStack[--index];
15 break;
16 case "/":
17 numStack[index - 2] /= numStack[--index];
18 break;
19 default:
20 numStack[index++] = Integer.parseInt(s);
21 }
22 }
23 return numStack[0];
24 }
25 }

力扣150(java)-逆波兰表达式求值(中等)的更多相关文章
- LeetCode 150:逆波兰表达式求值 Evaluate Reverse Polish Notation
题目: 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. Evaluate the value of an arithm ...
- Java实现 LeetCode 150 逆波兰表达式求值
150. 逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波 ...
- 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...
- LeetCode:逆波兰表达式求值【150】
LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...
- LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24
150. 逆波兰表达式求值 150. Evaluate Reverse Polish Notation 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, /.每个运算对象 ...
- 代码随想录算法训练营day11 | leetcode 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
基础知识 String StringBuilder 操作 public class StringOperation { int startIndex; int endIndex; { //初始容量为1 ...
- Leetcode 150.逆波兰表达式求值
逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总 ...
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- leetcode算法学习----逆波兰表达式求值(后缀表达式)
下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目: 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...
- SDIBT2666——逆波兰表达式求值
逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...
随机推荐
- think about 和 think of 区别
about 是 on by out 简称 about 在旁边 在外围 周边 think about you 想你有关的事 of 是 belong to 什么什么的 of指的是 这个人或者这个事本身相关 ...
- 麦克风阵列技术-beaforming开源算法源码分析
概述 在音频前端处理算法中,beamforming算法是一个无法绕过的存在,随着AI技术的广泛发展,前端语音技术的需求也在呈现个性化的动态范围.作为一个深耕音频算法多年的老兵,发现站在巨人的肩膀上 ...
- KTL 一个支持C++14编辑公式的K线技术工具平台
K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...
- 纯前端实现 PNG 图片压缩 | UPNG.js
在线 Demo 体验地址 →: https://demos.sugarat.top/pages/png-compress/ 前言 最近在迭代自己的 图床 应用,由于使用时间的累计,存储空间占用越来越大 ...
- 干货分享 | 3个Zbrush实用减面工具分享
一.使用Sculptris Pro Sculptris Pro是zbrush中的一个功能按钮,点击此工具按钮,同时将笔刷转换至standard笔刷,即可减去需要平滑的面. 点击开启Sculptris ...
- 记录--Vue使用CDN引入,响应式失效?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 最近心血来潮,想要在本地开发时,也用CDN的方式引入 Vue,想着既然通过CDN引入了,那么在项目中就没必要再 import Vue ...
- 记录--Vue开发历程---音乐播放器
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.audio标签的使用 1.Audio 对象属性 2.对象方法 二.效果 效果如下: 三.代码 代码如下: MusicPlayer.vu ...
- IDEA MyBatis Log 插件,打印SQL语句
打开Settings->plugins 搜索插件 MyBatis Log点击安装,完成后重启IDEA即可. 点击Tools,选择 MyBatis Log Plugin ,会在下方打开一个窗口,这 ...
- #线段树,欧拉函数#CF1114F Please, another Queries on Array?
题目 给一个长度为\(n\)的数组\(a\),\(q\)次询问 支持区间乘\(x\)以及求\(\varphi(\prod_{i=l}^ra_i)\) \(n\leq 4*10^5,q\leq 2*10 ...
- #Tarjan,拓扑排序#洛谷 3436 [POI2006]PRO-Professor Szu
题目 分析 考虑有向图缩点然后拓扑排序, 最恶心的地方是这题有自环, 一旦存在自环就意味着答案一定超过阈值 其实更难过的是Tarjan大小写写错没有发现qwq 代码 #include <cstd ...