首页 > 编程语言 >Leetcode150.逆波兰表达式求值(Java)

Leetcode150.逆波兰表达式求值(Java)

时间:2024-06-23 19:28:00浏览次数:27  
标签:Java Leetcode150 operand2 int pop 求值 operand1 stack 表达式

题目:

        给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

        栈的典型例题。题目要求为:求后缀表达式值。

示例 1:

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2:

输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

        以示例1、2为例,将后缀表达式转换为中缀表达式

例1:遇到数字2 ,1放入栈中,遇到 + 则弹出前两个数字(顺序为1 ,2),将前两个数字进行相加后再放回栈中。然后遇到3放入栈中,遇到 * 将两个前两个数字(3 和 3)弹出相乘后,放入栈中。此时栈里只存放这个表达式的结果9

例2:遇到前三个数字放入栈中。遇到 / 后,将前两个数字依次弹出(顺序为5,13),第二个弹出的是被除数13,第一个是除数5。 将运算结果放入栈中,此时栈里为 元素为13/5 和 4 。最后遇到+ ,将前两个元素弹出,运算结果放入栈中。

        需要注意的是,后弹出的数要在运算符的左边。如 13 5 /  

        代码设计:遍历字符数组, 如果字符数组中遍历数字,就push进栈中。如果遍历到四个运算符之一,则将栈弹出两次,然后将弹出的两个数operand1和operand2做运算,运算结果再push进栈里。

代码如下:

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();

        for(String token : tokens){
            if(token.equals("-")){

               int operand1 = stack.pop();
               int operand2 = stack.pop();
               stack.push(operand2 - operand1); //后弹出的数作为被减数

            }else if(token.equals("+")){

                int operand1 = stack.pop();
                int operand2 = stack.pop();
                stack.push(operand2 + operand1);

            }else if(token.equals("*")){

                int operand1 = stack.pop();
                int operand2 = stack.pop();
                stack.push(operand2 * operand1);

            }else if(token.equals("/")){

                int operand1 = stack.pop();
                int operand2 = stack.pop();
                stack.push(operand2 / operand1);//后弹出的数作为被除数


            }else{
                 //传入的是字符数组,需要将字符串转为int。
                 Integer number = Integer.parseInt(token); 
                 stack.push(number);
            }
        }

        return stack.peek(); //也可以是stack.pop();
    }
}

标签:Java,Leetcode150,operand2,int,pop,求值,operand1,stack,表达式
From: https://blog.csdn.net/m0_73904503/article/details/139899643

相关文章

  • Java链表
    在Java中,链表是一种动态数据结构,它不需要在内存中分配一块连续的空间,而是通过指针将节点连接起来。链表由节点(Node)的集合组成,每个节点包含两部分内容:数据(data)和指向下一个节点的引用(next)。Java中常见的链表类型有单向链表、双向链表和循环链表:单向链表(SinglyLinkedList):每......
  • javascript浏览器对象模型
    BOM对象:BOM是浏览器对象模型的简称。JavaScript将整个浏览器窗口按照实现的功能不同拆分成若干个对象;包含:window对象、history对象、location对象和document对象等window对象:常用方法:1.prompt();显示可提示用户输入的对话框window.prompt("请输入您的名字");返......
  • Java语言常用注解(Annotation)收录
    Java语言常用注解(Annotation)收录注解(Annotation)是一种用于在代码中插入元数据的方式,以便为编译器、开发工具或运行时环境提供信息。自Java5引入以来,注解已成为Java平台不可或缺的一部分,用于各种场景,如编译时检查、框架集成、依赖注入等。下面收录了一些开发过程中常用......
  • 基于JavaSpringBoot+Vue+uniapp技术的微信小程序鲜花商城购物系统设计与实现
    博主介绍:硕士研究生,专注于Java技术领域开发与管理,以及毕业项目实战✌    从事基于javaBS架构、CS架构、c/c++编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经验。    先后担任过技术总监、部门经理、......
  • [Java并发]Thread
    Java开启线程的四种方式实现runnable接口这个方法有一个很大的缺点就是重写的run方法是没有返回值的,如果想要返回值,需要使用下面的方法publicclassRunnableImplimplementsRunnable{/**创建步骤如下:*1,定义Runnable接口的实现类,并且实现run方法,这个方法......
  • JAVA类与对象的基础概念(JAVA基础)
    类的定义1.定义:类可以看做是一个模版,或者图纸,系统根据类的定义来造出对象2.属性:用于定义该类或该类对象包含的数据或者说静态特征3.初始化∶定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化4.方法:用于定义该类或该类实例的行为特征和功能实现......
  • [Java并发]ConcurrentHashMap
    ConcurrentHashMapHashMap和ConcurrentHashMap的区别主要区别就是hashmap线程不安全,ConcurrentHashMap线程安全HashMap线程不安全,有以下两个问题put覆盖问题比如有两个线程A和B,首先A希望插入一个key-value对到HashMap中,首先计算记录所要落到的桶的索引坐标,然后获取到该桶......
  • [Java基础]String
    String常量池/运行时常量池java类编译之后生成的.class文件包含三部分信息,类的基本信息,常量池,方法的定义通过javap-vxxxx.class命令可以看到Constantpool:#1=Methodref#2.#3//java/lang/Object."<init>":()V#2=Class#4......
  • Java Stream 8 API
    动态多字段排序动态多字段排序假设我们有一个Person类,希望能够按照age和name进行动态排序。我们使用上述代码生成一个组合比较器来完成多字段排序。1.定义Person类java复制代码importjava.util.HashMap;importjava.util.Map;publicclassPerson{privateM......
  • vscode开发纯java项目兼容eclipse
    最近想使用vscode作为开发工具逐步替代eclipse,但是不影响eclipse作为项目管理的配置。以下是踩坑过程:1、项目之间的依赖。如主projectA依赖projectB,projectB并不是已jar包的形式,而是项目的形式在eclipse中的,eclipse有个很方便的功能是直接把项目添加进依赖中,vscode貌似找不到直接......