java数据结构与算法刷题-----LeetCode150. 逆波兰表达式求值

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 本题也叫后缀表达式,更利于机器处理
  2. 题目给出的案例都是正确的后缀表达式,因此我们无需考虑很多出错情况
  3. 只要后缀表达式正确,那么我们只要遇到数字就放入栈中,遇到操作符就进行操作,则都会遵循:
  1. 每遇到一个操作符,栈中一定有两个数字,这两个数字就是参与运算的操作数
  2. 所有操作符运算完成后,栈中一定剩下一个数字,就是最终表达式的结果
  3. 每处理一个操作符,会从栈中取出两个元素进行操作,然后将结果放回栈
抽象成为二叉树

在这里插入图片描述
在这里插入图片描述

代码
  1. 用栈直接模拟
    在这里插入图片描述
class Solution {
    //非递归版本
    public int evalRPN(String[] tokens) {
        int n = tokens.length;
        int stack[] = new int[(n+1)/2];//数组模拟栈,只需要一半大小的栈,因为本质上是一课二叉树
        int top = -1;//栈顶指针
        for(int i = 0;i < n; i++){//遍历数组
            String token = tokens[i];//获取当前元素
            switch(token){
                case "+"://如果是+操作
                    top--;//取出两个数字,然后相加,然后在放回栈。因此top只需减一次
                    stack[top]+=stack[top + 1];//模拟栈顶两个元素相加,放回栈顶
                    break;//结束本次操作
                case "-"://剩余都和+操作相同
                    top--;
                    stack[top] -= stack[top + 1];
                    break;
                case "*":
                    top--;
                    stack[top] *= stack[top + 1];
                    break;
                case "/":
                    top--;
                    stack[top] /= stack[top + 1];
                    break;
                default://如果是数字就放入栈中
                    top++;
                    stack[top] = Integer.parseInt(token);
            }//end_switch
        }//end_for
        return stack[top];//最后后缀表达式的结果一定是栈顶元素。
    }
}
  1. 抽象为二叉树进行深度优先遍历,dfs
    在这里插入图片描述
class Solution {
    String[] tokens;//将tokens保存到公共中,递归时可以直接使用
    int cur;//二叉树指针
    public int evalRPN(String[] tokens) {
        this.tokens = tokens;
        cur = tokens.length - 1;//指针初始指向最后一个字符,也就是根结点
        return dfs(); //进行dfs
    }

    public int dfs() {
        String token = tokens[cur--];//拿到当前结点
        switch(token) {//如果是操作符,左右孩子如果是数字就进行运算
            case "+" -> {return dfs() + dfs();}
            case "*" -> {return dfs() * dfs();}
            case "-" -> {
                int right = dfs();
                int left = dfs();
                return left - right;
            }
            case "/" -> {
                int right = dfs();
                int left = dfs();
                return left / right;
            }
            //如果当前不是操作符,就把数字返回,让其参与运算
            default -> {return Integer.valueOf(token);}
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Find My资讯|苹果Vision Pro无法通过Find My进行远程定位和发声

苹果 Vision Pro 头显现在已经正式开售&#xff0c;不过根据该公司日前发布的支持文件&#xff0c;这款头显目前缺乏一系列关键查找功能&#xff0c;用户无法在 iCloud 网站或Find My应用中获悉头显的位置&#xff0c;也无法让这款头显远程播放声音。 不过支持文件同时提到 V…

【快速解决】python项目打包成exe文件——vscode软件

目录 操作步骤 1、打开VSCode并打开你的Python项目。 2、在VSCode终端中安装pyinstaller&#xff1a; 3、运行以下命令使用pyinstaller将Python项目打包成exe文件&#xff1a; 其中your_script.py是你的Python脚本的文件名。 4、打包完成后&#xff0c;在你的项目目录中会…

多线程---线程同步,线程通信

线程同步 1.概述 线程同步是多线程编程中的一个重要概念&#xff0c;它指的是在多线程环境中&#xff0c;通过一定的机制保证多个线程按照某种特定的方式正确、有序地执行。这主要是为了避免并发问题&#xff0c;如死锁、竞态条件、资源争用等&#xff0c;确保数据的一致性和完…

Python 基于 AI 动物识别技术的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

hope实验室预备役第三次测试题解

目录 1.选数 2.奇怪的电梯 3.无线通讯网 4. Rotate Colored Subsequence 5.LOWER 6.Error Correction 1.选数 P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 已知 n 个整数 1,2,⋯ ,x1​,x2​,⋯,xn​&#xff0c;以及 1 个整…

VNCTF 2024 Web方向 WP

Checkin 题目描述&#xff1a;Welcome to VNCTF 2024~ long time no see. 开题&#xff0c;是前端小游戏 源码里面发现一个16进制编码字符串 解码后是flag CutePath 题目描述&#xff1a;源自一次现实渗透 开题 当前页面没啥好看的&#xff0c;先爆破密码登录试试。爆破无果…

洗地机什么牌子最好?家用洗地机推荐

如今洗地机已经在家庭中扮演着至关重要的角色&#xff0c;随着人们对居住环境的卫生要求越来越高&#xff0c;洗地机作为结合了吸尘和拖地为一体的清洁工具&#xff0c;不仅可以高效的帮助我们清洁地板&#xff0c;节省时间&#xff0c;还可以为我们节省很多收纳空间。那么&…

typeScript 类型推论

什么是类型推论&#xff1f; 类型推论是 TypeScript 中的一个特性&#xff0c;它允许开发人员不必显式地指定变量的类型。相反&#xff0c;开发人员可以根据变量的使用情况让 TypeScript 编译器自动推断出类型。例如&#xff0c;如果开发人员将一个字符串赋值给一个变量&#…

【力扣白嫖日记】1795.每个产品在不同商店的价格

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1795.每个产品在不同商店的价格 表&#xff1a;Products 列名类型product_idintstore1intstore2intstore3in…

项目中和兄弟部门难以高效协作?你需要注意这四点

在组织架构日益复杂的今天&#xff0c;靠一个人单打独斗完成工作或项目越来越难&#xff0c;也越来越不可能。不知你是否留意过&#xff0c;无论招聘什么岗位&#xff0c;几乎所有企业都在强调“团队合作”。 这里的团队不光指的是同部门协作&#xff0c;要包括公司内部的跨部门…

网络原理 - HTTP/HTTPS(1)

HTTP HTTP是什么 HTTP("全程超文本协议")是一种应用非常广泛的应用层协议. 文本:字符串(能在utf8/gbk)码表上找到合法字符. 超文本:不仅是字符串,还能携带图片啥的(HTML). 富文本:类似于word文档这种. HTTP诞生于1991年.目前已经发展为最主流使用的一种应用层协议.…

不等式的证明之二

不等式的证明之二 证明下述不等式证法一证法二证法二的补充 证明下述不等式 设 a , b , c a,b,c a,b,c 是正实数&#xff0c;请证明下述不等式&#xff1a; 11 a 5 a 6 b 11 b 5 b 6 c 11 c 5 c 6 a ≤ 3 \begin{align} \sqrt{\frac{11a}{5a6b}}\sqrt{\frac{11b}{5b6c}…

centos7如何切换到root用户

在 CentOS 7 中&#xff0c;你可以通过几种方式切换到 root 用户。最常用的方法是使用 su (switch user) 命令或者 sudo 命令。这里是如何使用这些命令的详细说明&#xff1a; 使用 su 命令 打开终端。输入以下命令并按下回车键&#xff1a;su -系统会提示你输入 root 用户的…

云手机在引流方面有什么优势?

对于电商商家而言&#xff0c;无论是在亚马逊还是其他平台&#xff0c;有效的流量来源主要集中在短视频引流和社交电商营销。要在新兴社交平台为企业电商带来更多流量&#xff0c;不可忽视云手机的关键作用和独特优势。 云手机的定义与作用 在经营TikTok、Facebook和INS账号时&…

外汇110:外汇做空是什么意思?如何运作?一文读懂

外汇市场允许卖空&#xff0c;就像众多金融市场一样。但什么是卖空呢&#xff1f;如何外汇做空&#xff1f;在本文中&#xff0c;我们将讨论如何做空货币。什么是外汇做空&#xff1f; 外汇做空&#xff08;Short Selling&#xff09;是外汇市场上的一种投资方式。它指的是投资…

Java面向对象案例之设计用户去ATM机存款取款(三)

需求及思路分析 业务代码需求&#xff1a; 某公司要开发“银行管理系统”&#xff0c;请使用面向对象的思想&#xff0c;设计银行的储户信息&#xff0c;描述存款、取款业务。 储户类的思路分析&#xff1a; 属性&#xff1a;用户姓名、密码、身份证号、账号、帐户余额 方法&a…

vue生命周期函数

父子组件加载顺序 加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted子组件更新过程 父beforeUpdate->子beforeUpdate->子updated->父updated父组件更新过程 父beforeU…

JS画布内生成图标,并实现拖拽,连线,刷新

JS有现成的拖拽命令&#xff0c;但是只能实现简单的拖拽功能&#xff0c;下面演示的可以在画布的任意一个地方拖拽&#xff0c;并停留在画布的任意地方。 整个框架代码如下&#xff1a; <html> <head><meta charset"UTF-8"><title>拖拽放置…

【详解】图的概念和存储结构(邻接矩阵,邻接表)

目录 图的基本概念&#xff1a; 图的存储结构 邻接矩阵&#xff08;GraphByMatrix&#xff09;&#xff1a; 基本参数&#xff1a; 初始化&#xff1a; 获取顶点元素在其数组中的下标 &#xff1a; 添加边和权重&#xff1a; 获取顶点的度&#xff1a; 打印图&#xf…

动态代理IP如何选择?

IP地址是由IP协议所提供的一种统一的地址格式&#xff0c;通过为每一个网络和每一台主机分配逻辑地址的方式来屏蔽物理地址的差异。根据IP地址的分配方式&#xff0c;IP可以分为动态IP与静态IP两种。对于大部分用户而言&#xff0c;日常使用的IP地址均为动态IP地址。从代理IP的…