题目:

根据 逆波兰表示法,求表达式的值。

有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

注意 两个整数之间的除法只保留整数部分。

可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 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)-逆波兰表达式求值(中等)的更多相关文章

  1. LeetCode 150:逆波兰表达式求值 Evaluate Reverse Polish Notation

    题目: 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. Evaluate the value of an arithm ...

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

    150. 逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波 ...

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

    第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...

  4. LeetCode:逆波兰表达式求值【150】

    LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...

  5. LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24

    150. 逆波兰表达式求值 150. Evaluate Reverse Polish Notation 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, /.每个运算对象 ...

  6. 代码随想录算法训练营day11 | leetcode 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

    基础知识 String StringBuilder 操作 public class StringOperation { int startIndex; int endIndex; { //初始容量为1 ...

  7. Leetcode 150.逆波兰表达式求值

    逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总 ...

  8. lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

    题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...

  9. leetcode算法学习----逆波兰表达式求值(后缀表达式)

    下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目:  有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...

  10. SDIBT2666——逆波兰表达式求值

    逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...

随机推荐

  1. 使用Deployment和Service实现简单的灰度发布

    在Kubernetes中,使用单个Service和多个Deployment来实现灰度发布的一种常见方法是利用标签(Labels)和选择器(Selectors)来控制哪些Pods接收来自Service的 ...

  2. Windows10 Linux 子系统的骚操作之 Ctrl+Alt+T shell启动终端

    巨硬的 WSL(Windows Subsystem for Linux)是真的好用 但是,由于本人比较喜欢按快捷键.所以一直想着找到Windows上安装的ubuntu.exe文件,搞个快捷方式,然后再 ...

  3. python 音频通道分离的源码实现

    一 前记 作为一个音频工程师,仅仅依靠鼠标点击,没有一些自己的小工具的话,肯定是不合格的了. 最近用到了一个音频通道分离的功能,这里就用python敲击了一下,这里做个备忘吧,给有需求的小伙伴抛砖引玉 ...

  4. java项目打包成jar包

    参考,欢迎点击原文:https://www.bilibili.com/video/BV16K411H7Tt?from=search&seid=12445640905127816624(B站) ...

  5. Git进阶命令-reset

    之前有关Git,写过一片文章: Git五个常见问题及解决方法 一.reset命令使用场景 有时候我们提交了一些错误的或者不完善的代码,需要回退到之前的某个稳定的版本,面对这种情况有两种解决方法: 解决 ...

  6. linux使用hostapd+dnsmasq管理多张网卡,搭建dns服务器,并发射wifi热点(支持360wifi等等)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文发布于 2015-03-03 18:37:39 ...

  7. Java浮点数内存存储

    转自: [解惑]剖析float型的内存存储和精度丢失问题 1.小数的二进制表示问题 首先我们要搞清楚下面两个问题: (1)  十进制整数如何转化为二进制数 算法很简单.举个例子,11表示成二进制数: ...

  8. 面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!

    写在开头 面试官:小伙子,JMM了解吗? 我:JMM(Java Memory Model),Java内存模型呀,学过的! 面试官:那能给我详细的聊一聊吗,越详细越好! 我:嗯~,确定越详细越好?起码得 ...

  9. 【leetcode 2949 统计美丽子字符串】

    import java.util.HashMap; import java.util.Map; class Solution { public static void main(String[] ar ...

  10. [TM4] TM4C123G Keil5 新建工程指南

    [TM4] TM4C123G Keil5 新建工程指南 keil新建工程,选择TM4C123GH6PM芯片,然后在CMSIS勾选CORE,DEVICE勾选Startup(如图),来到新工程界面 在So ...