首页 > 编程语言 >关于力扣150题目——逆波兰表达式求值Java实现的三种解法

关于力扣150题目——逆波兰表达式求值Java实现的三种解法

时间:2024-07-09 23:56:50浏览次数:15  
标签:tokens 150 index int 力扣 token eval 求值 stack


题目介绍

逆波兰表达式是一种后缀表达式,其运算符位于操作数之后。力扣150题目要求我们实现一个函数,计算给定逆波兰表达式的值。本文将介绍三种不同的Java实现方法来解决这个问题。

解法一:使用栈

这是最直观和常见的解法,使用栈来存储操作数,并在遇到运算符时从栈中弹出操作数进行计算,然后将结果压入栈中。以下是具体实现:

import java.util.*;

public class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        
        for (String token : tokens) {
            if (token.equals("+")) {
                int num2 = stack.pop();
                int num1 = stack.pop();
                stack.push(num1 + num2);
            } else if (token.equals("-")) {
                int num2 = stack.pop();
                int num1 = stack.pop();
                stack.push(num1 - num2);
            } else if (token.equals("*")) {
                int num2 = stack.pop();
                int num1 = stack.pop();
                stack.push(num1 * num2);
            } else if (token.equals("/")) {
                int num2 = stack.pop();
                int num1 = stack.pop();
                stack.push(num1 / num2);
            } else {
                stack.push(Integer.parseInt(token));
            }
        }
        
        return stack.pop();
    }
}

解法二:使用数组模拟栈

由于逆波兰表达式求值只需要后进先出的特性,我们也可以使用数组来模拟栈的操作,从而避免使用Java的Stack类。这种方法可以稍微提高一点性能,因为省去了Stack类的一些操作开销。以下是实现代码:

public class Solution {
    public int evalRPN(String[] tokens) {
        int[] stack = new int[tokens.length];
        int index = 0;
        
        for (String token : tokens) {
            switch (token) {
                case "+":
                    stack[index - 2] += stack[--index];
                    break;
                case "-":
                    stack[index - 2] -= stack[--index];
                    break;
                case "*":
                    stack[index - 2] *= stack[--index];
                    break;
                case "/":
                    stack[index - 2] /= stack[--index];
                    break;
                default:
                    stack[index++] = Integer.parseInt(token);
                    break;
            }
        }
        
        return stack[0];
    }
}

解法三:使用递归和指针

这种解法使用递归来实现逆波兰表达式的求值,通过一个指针来遍历表达式数组,每次递归处理一个运算符或操作数,直至整个表达式求值完成。以下是实现代码:

public class Solution {
    int index = 0;
    
    public int evalRPN(String[] tokens) {
        index = tokens.length - 1;
        return eval(tokens);
    }
    
    private int eval(String[] tokens) {
        String token = tokens[index--];
        if (token.equals("+")) {
            return eval(tokens) + eval(tokens);
        } else if (token.equals("-")) {
            return eval(tokens) - eval(tokens);
        } else if (token.equals("*")) {
            return eval(tokens) * eval(tokens);
        } else if (token.equals("/")) {
            return eval(tokens) / eval(tokens);
        } else {
            return Integer.parseInt(token);
        }
    }
}

总结

以上三种解法都能有效地求解逆波兰表达式的值,它们各有优劣。第一种解法最为直观和常见,第二种解法省去了使用Stack类的开销,第三种解法则使用了递归的方法,较为巧妙。在实际应用中,可以根据具体情况选择合适的实现方式来达到更好的性能和可读性。

希望本文能够帮助读者更深入理解逆波兰表达式求值的问题及其解决方法。


这篇文章覆盖了三种不同的逆波兰表达式求值解法,希望对你有所帮助!

标签:tokens,150,index,int,力扣,token,eval,求值,stack
From: https://blog.csdn.net/2301_77695569/article/details/140309629

相关文章

  • Solution - Atcoder ARC150D Removing Gacha
    考虑到每次操作都比定会选上一个点,于是答案可以表示为每个点被选中的次数之和。即令\(c_i\)为\(i\)点被选中的次数,答案即为\(E(\sum\limits_{i=1}^nc_i)\)。根据期望的线性性,考虑把答案的\(E\)拆到每个\(c_i\)上,即变为\(\sum\limits_{i=1}^nE(c_i)\)的形式。......
  • 力扣常用c++操作
    数字转字符串to_string()自定义sort函数sort(intervals.begin(),intervals.end(),[](vector<int>&v1,vector<int>&v2){returnv1[0]<v2[0];});自定义二分查找autoinsertit=lower_bound(intervals.begin(),intervals.end(),newInterval[0],......
  • 应用程序无法正常启动(0xc0150002)的解决思路
    背景介绍一测试朋友,因为重装了操作系统,然后之前的工具突然无法使用了。现象现象1现象2解决现象1很显然,缺少运行库。你如果安装了visualstudio,那么其安装目录下xxx\MicrosoftVisualStudio\2019\Professional\VC\Redist\MSVC会存在需要的运行库或者是运行库安装......
  • 算法力扣刷题 三十五【二叉树基础和递归遍历】
    前言进入二叉树学习。继续。一、二叉树基础理论理论篇——参考链接以下是大纲:二、遍历方式学习递归法实现前、中、后遍历方法。“输入”阶段此处用了第一次递归法实现根据题目的双指针操作,传递递归的参数。解释递归(1)递归:自己调用自己。重复执行一段代码,但是......
  • 力扣—盛水最大的容器—双指针
    文章目录题目解析解题思路代码实现题目解析解题思路利用单调性控制其中一个变量,使用双指针控制另一个变量。我们知道S1(面积)=h(高度)*w(宽度)。由于高度的大小是随机的不可控,所以我们可以尝试控制宽度,定义变量left和right分别指向数组第一个元素和最后一个元素......
  • 力扣第7题:整数反转 字符串函数综合运用(C++)
    给你一个32位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围 [−231, 231 −1] ,就返回0。假设环境不允许存储64位整数(有符号或无符号)。示例1:输入:x=123输出:321示例2:输入:x=-123输出:-321示例3:......
  • 力扣第22题:括号生成 深度优先搜索(DFS)和它的优化(C++)
    数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]思路递出去,再归回来,是为递归。DFS算法是利用递归思想的一种搜索算法。想象一个矿井,从地面到井底有多层......
  • 力扣第6题:Z字形变换 交替V和Λ规律法(C++)
    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。......
  • 3年阿里hk主机干房BGP仅需150元 5年270元,单月4.2元(大水管)
    首先需要说明的是这个神仙操作不是我原创的,我只是进行二次归纳进行再次恰饭。感谢各位大佬提供的购买思路,真是把规则研究透了。 结论完成本文全部操作后你将以150-270元获取3-5年的下述服务器(或者白嫖到底0元购获取1年),这个价格我感觉很划算了毕竟是大厂的BGP线路,而且三网拉直,2......
  • 3101.力扣每日一题7/6 Java(接近100%解法)
    博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......