【Java版oj】逆波兰表达式求值

news2025/1/19 19:24:59

目录

一、原题再现

二、问题分析

三、完整代码


一、原题再现

150. 逆波兰表达式求值

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

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

可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 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 + * 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

二、问题分析

遍历数组,将数字压入栈中,当遇见运算符时,就从栈中取出两个元素进行运算,并将结果压入栈中。直到遍历完最后一次运算结果压入栈中。

本题有一个注意点,就是将String类型转换成long类型才能进行加减乘除的运算。

1.Long.parseLong(String):将 string 参数解析为有符号十进制 long,字符串中的字符必须都是十进制数字。
2.Long.valueOf(String):参数String表示,指定 String 的值的 Long 对象。该参数被解释为表示一个有符号的十进制 long,该值与用该参数作为参数的 parseLong(java.lang.String) 方法得到的值非常相似。只是最后被转换为一个Long的包装类。

三、完整代码


class Solution {
    public int evalRPN(String[] tokens) {
        Stack <Long> stack= new Stack<>();
        for(int i=0;i<tokens.length;i++){
            if(!isOperator(tokens[i])){
                long elem=Long.parseLong(tokens[i]);
                stack.push(elem);
            }else{
                long elem2=stack.pop();
                long elem1=stack.pop();
                long result=calculate(elem1,elem2,tokens[i]);
                stack.push(result);
            }
        }
        Long e=stack.peek();
        long ans=e.longValue();
        return (int)ans;
    }
    private boolean isOperator(String token){
        if((token.equals("+"))||(token.equals("*"))||(token.equals("-"))||(token.equals("/"))){
            return true;
        }else{
             return false;
        }
    }
    private long calculate(long elem1,long elem2,String token){
        switch(token){
            case "+":return elem1+elem2;
            case "-":return elem1-elem2;
            case "*":return elem1*elem2;
            case "/":return elem1/elem2;
            default:return -1;
        }
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes核心指标监控——Metrics Server详解

1、概述 从Kubernetes v1.8 开始&#xff0c;资源使用情况的监控可以通过 Metrics API的形式获取&#xff0c;例如容器CPU和内存使用率。这些度量可以由用户直接访问&#xff08;例如&#xff0c;通过使用kubectl top命令&#xff09;&#xff0c;或者由集群中的控制器&#x…

Simulink|电动汽车、永磁电动机建模与仿真

目录 1 永磁同步电机 1.1 概述 1.2 PMSM 的建模 1.3 PMSM 的矢量控制 1.4 使用 SIMSCAPE 块建模 1.5 子系统ECU 2 直流电机 3 电动车 1 永磁同步电机 1.1 概述 本文旨在模拟永磁同步电机的性能&#xff0c;该电机使用 Rinehart 运动系统-交流电机控制器进行控制。首先收…

基于C+++Oracle11实现(PC)学生成绩教务管理系统【100010050】

学生成绩教务管理系统 一.分析与建模 系统业务流程图 项目用例图&#xff1a; 功能需求分析与建模 数据需求分析与建模 体之间的联系&#xff1a;学生信息表&#xff08;student&#xff09;、教师信息表&#xff08;teacher&#xff09;、管理员信息表&#xff08;Administ…

Redisson夺命15连问

在一个分布式系统中&#xff0c;由于涉及到多个实例同时对同一个资源加锁的问题&#xff0c;像传统的synchronized、ReentrantLock等单进程情况加锁的api就不再适用&#xff0c;需要使用分布式锁来保证多服务实例之间加锁的安全性。常见的分布式锁的实现方式有zookeeper和redis…

深入Java线程池:从设计思想到源码解读

1. 前言 线程池深入详解 2. 初识线程池 我们知道&#xff0c;线程的创建和销毁都需要映射到操作系统&#xff0c;因此其代价是比较高昂的。出于避免频繁创建、销毁线程以及方便线程管理的需要&#xff0c;线程池应运而生。 2.1. 线程池优势 降低资源消耗&#xff1a;线程池…

【观察】亚马逊云科技:探索Serverless创新的“无人区”

毫无疑问&#xff0c;从2006年发展至今的公有云&#xff0c;堪称是云计算的黄金时代。在此过程中&#xff0c;云计算领域涌现出了很多改变传统IT架构和运维方式的新技术&#xff0c;特别是Serverless&#xff08;无服务器计算&#xff09;架构的出现&#xff0c;更带来了一次跨…

re:Invent|亚马逊云科技如何赋能广告、游戏、医疗

亚马逊云科技是如何高效利用海量跨域数据进行广告营销的同时&#xff0c;保障用户数据安全隐私呢&#xff1f;亚马逊云科技又在游戏行业、医疗与生命科学、汽车、金融等等行业和领域纷纷推出哪些关键发布和创新应用呢&#xff1f;应行业需求而生&#xff0c;解业务场景之痛&…

用 Footprint Analytics 的数据 API 快速建立你的项目

Footprint 有一个独特的、非常灵活的API&#xff0c;允许你为数据分析建立成熟的数据管道&#xff0c;以及机器学习应用。这是通过提供两种类型的接口来实现的&#xff1a;第一种是用于将数据上传到平台&#xff08;Upload API&#xff09;&#xff1b;第二种是用于从平台获取数…

C语言函数全解

文章目录一.函数的概念二.C语言中函数的分类2.1库函数C语言库函数的大致分类C语言学习/查找途径2.2自定义函数函数的实参函数的形参函数的传值调用函数的传址调用三.函数的返回值四.函数的链式访问五.函数的嵌套调用六.函数的定义和声明七.函数的递归7.1例题.递归求字符串长度7…

如何使用 FastReport VCL 对文件进行数字签名?

FastReport VCL是用于在软件中集成商务智能的现代解决方案。它提供了可视化模板设计器&#xff0c;可以访问最受欢迎的数据源&#xff0c;报告引擎&#xff0c;预览&#xff0c;将过滤器导出为30多种格式&#xff0c;并可以部署到云&#xff0c;Web&#xff0c;电子邮件和打印中…

MySQL主从复制太慢,怎么办?

本文分析了MySQL主从延迟的原因以及介绍了MTS方案。点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达mysql主从同步延迟原因导致备库延迟的原因主要有如下几种&#xff1a;通常备库所在机器的性能要比主库所在的机器性能差&#xff0c;执行…

用DIV+CSS技术设计的体育主题网站(足球介绍)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

STM32F4 | 窗口门狗(WWDG)实验

文章目录一、STM32F4 窗口看门狗简介二、硬件设计三、软件设计四、实验现象五、STM32CubeMX 配置 WWDG在本章中&#xff0c;我们将使用窗口看门狗的 中断功能来喂狗&#xff0c;通过 DS0 和 DS1 提示程序的运行状态。一、STM32F4 窗口看门狗简介 窗口看门狗&#xff08;WWDG&…

【机器学习】算法术语、决策函数、概率模型、神经网络的详细讲解(图文解释)

一、机器学习算法术语 1&#xff09;数据集&#xff08;Data Set&#xff09;&#xff0c;训练集&#xff08;Training Set&#xff09;&#xff0c;验证集&#xff08;Validation Set&#xff09;和测试集&#xff08;Test Set&#xff09; 数据集分为训练数据和测试数据。测…

100%都会感染,第一波症状最重,后面会轻。家里一定要备这些东西!

这是某医院院长在医院内部会议上关于新冠防治的强调内容&#xff0c;我听了很受教育&#xff0c;觉得非常有必要普及开来&#xff0c;我相信这位院长的专业性。这段会议发言的录音已经在网上流传&#xff0c;由于录音听起来费时且不宜传播&#xff0c;我已将录音转为文字&#…

Kibana入门教程

一、什么是Kibana   Kibana 是一个开源的分析和可视化平台&#xff0c;Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析&#xff0c;并在各种图表、表格和地图中可视化数据 二、安装使用 ①&#xf…

社招前端常考手写面试题总结

手写 Promise const PENDING "pending"; const RESOLVED "resolved"; const REJECTED "rejected";function MyPromise(fn) {// 保存初始化状态var self this;// 初始化状态this.state PENDING;// 用于保存 resolve 或者 rejected 传入的值…

【Python机器学习】使用决策树模型预测消费者未来消费行为实战(附源码和数据集 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一个预测未来消费行为的示例&#xff0c;即已经采集了过去消费行为的信息&#xff0c;并用来建立一个模型以对未来的消费行为进行预测。该示例简要演示了数据预处理、提取特征、选择模型、训练模型、评估模型、应用等阶段&a…

ModStartCMS v5.4.0 输入过滤增强,导入导出支持

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

【Java初阶】面向对象三大特性之继承

一、继承 理解继承 Cat继承了Animal类&#xff0c;其中&#xff1a;Animal类称为父类/基类或超类&#xff0c;Cat可以称为Animal的 子类/派生类&#xff0c;继承之后&#xff0c;子类可以复用父类中成员&#xff0c;子类在实现时只需关心自己新增加的成员即可 Java中不支持多继…