表达式求值

表达式求值

给定一个字符串,它只包含 ()* - + /和数字。计算出表达式。

使用递归的方式实现。 在这里讲一下思路。

整体思路:

使用 process(String str) 函数进行递归。当遇到计算符号的时候,则按照计算符号进行切分。例如,1 + 2 则切分为 process("1") + process("2")。具体的规则如下:

  1. 当计算符号是 ( 的时候,则找到与其配对的 ), 然后切分为 process(before + result + after ) , 其中 before 是 ( 前面的字符串,after 是 )的字符串,result 是 ( ) 里面表达式的计算结果。
  2. 优先截断 + - 两个计算符号,* \ 放在其后面。这样就能保证乘除法比加减法优先级第了。

上代码:

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String expression = in.nextLine();
            System.out.println(process(expression));
        }
    }
    public static final String PLUS = "+";
    public static final String M = "-";
    public static final String START = "*";
    public static final String D = "/";
    public static final String L = "(";
    public static final String R = ")";

    public static int process(String expression){
        // 使用 lastIndexOf 从后往前找计算符号,可以保证从左往右计算的顺序
        int position = expression.lastIndexOf(L);
        if(-1 != position){
            String sub = expression.substring(position+1);
            char[] chars = sub.toCharArray();
            int cnt = 0 ;
            int i = 0 ;
            /*
            会遇到这种情况,(1 + (1 + 3)) , 需要从 position 位置,往后找到与其匹配的 ) d
            cnt 是为了记录是否 position 和 ) 之间是否有成对的括号。遇到 ( ++ , 遇到 ) --
            这样的话, 当遇 cnt == 0 && chars[i] == ')' 的条件成立的时候,也就是走过了
            成对的小括号,找到了与第一个左括号匹配的右括号。
            */
            while (!(cnt == 0 && chars[i] == ')')){
                if('(' == chars[i]){
                    cnt++;
                }else if(')' == chars[i]){
                    cnt--;
                }
                i++;
            }
            String rs = process(sub.substring(0, i)) + "";
            return process(expression.substring(0 , position) + rs + (i == sub.length()-1? "" : sub.substring(i+1)));
        }
        position = expression.lastIndexOf(PLUS);
        /*
         减号的情况比较复杂,例如,10 - 9*-1 , -1*-1 -1
         1)当遇到 -1 的情况,使用正则表达式判断一下即可,
         2)当遇到 10 - 9*-1 的情况,需要往前找到一个前面是数字后面是减号的情况。
         3)当遇到 -1*-1 的情况,p2 = 0 , 此时其实没有减号,里面只有负号,此时让 p2 = -1 。
         其实可以让 1) 和 3) 的情况合并在一起。
        */
        if(expression.matches("\\-\\d+")){
            return Integer.parseInt(expression);
        }
        int p2 = expression.lastIndexOf(M);
        int startIndex = (-1 == p2 ? -1 : p2 -1) ;
        while( startIndex>=0 && p2 >= 1 && !('0' <= expression.charAt(p2-1) && expression.charAt(p2-1) <= '9' && '-' == expression.charAt(p2))  ){
            p2 = expression.lastIndexOf(M , startIndex);
            if(-1 == p2) break ;
            startIndex = p2 - 1 ;
        }
        if(p2 == 0){
            p2 = -1 ;
        }
        if(position > p2 && -1 != position){
            return process(expression.substring(0 , position)) + process(expression.substring(position+1));
        }
        if(position < p2 && -1 != p2){
            return process(expression.substring(0 , p2)) - process(expression.substring(p2+1));
        }

        position = expression.lastIndexOf(START);
        p2 = expression.lastIndexOf(D);
        if(position > p2 && -1 != position){
            return process(expression.substring(0 , position)) * process(expression.substring(position+1));
        }
        if(position < p2 && -1 != p2){
            return process(expression.substring(0 , p2)) / process(expression.substring(p2+1));
        }
        return Integer.parseInt(expression);
    }
}

AST Tree 的方式,者中方式其实本质上也是递归的方式。

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

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

相关文章

直流马达驱动芯片D6289ADA介绍

应用领域 适用于智能断路器&#xff08;家用或工业智能空开&#xff09;、新能源汽车充电枪锁、电动玩具、电磁门锁、自动阀门等的直流电机驱动。 功能介绍 D6289ADA是一款直流马达驱动芯片&#xff0c;它有两个逻辑输入端子用来控制电机前进、后退及制动。该电路具有良好的抗干…

2024软件设计师备考讲义——(8)

操作系统 〇、操作系统概述 OS作用、OS特征、OS分类 作用&#xff1a;提高计算机效率&#xff0c;人机交互友好特征&#xff1a;并发性、共享性、虚拟性、不确定性分类&#xff1a;批处理、分时、实时、网络、分布式、微机嵌入式操作系统&#xff1a;微型化、可定制、实时性、可…

岭师大数据技术原理与应用-序章-软工版

HeZaoCha-CSDN博客 序章—软工版 一、环境介绍1. VMware Workstation Pro2. CentOS3. Java4. Hadoop5. HBase6. MySQL7. Hive 二、系统安装1. 虚拟网络编辑器2. 操作系统安装 三、结尾 先说说哥们写这系列博客的原因&#xff0c;本来学完咱也没想着再管部署这部分问题的说&…

卷积神经网络(CNN)——基础知识整理

文章目录 1、卷积神经网络 2、图片格式 3、图片卷积运算 4、Kernel 与 Feature Map 5、padding/边缘填充 6、Stride/步长 7、pooling/池化 8、shape 9、epoch、batch、Batch Size、step 10、神经网络 11、激活函数 1、卷积神经网络 既然叫卷积神经网络&#xff0c;这里面首先是…

设计模式——结构型——外观模式Facade

处理器类 public class Cpu {public void start() {System.out.println("处理器启动了...");} } 内存类 public class Memory {public void start() {System.out.println("内存启动了...");} } 硬盘类 public class Disk {public void start() {Syste…

【娱乐】战双帕弥什游戏笔记攻略

文章目录 Part.I IntroductionChap.I Information Part.II 新手攻略Chap.I 角色和武器挑选Chap.II 新手意识推荐 Part.II 阵容搭配Chap.I 一拖二Chap.II 毕业队 Reference Part.I Introduction 2019年12月5日全平台公测。 偶然间入坑战双&#xff0c;玩了几天&#xff0c;觉得…

V R虚拟现实元宇宙的前景|虚拟现实体验店加 盟合作|V R设备在线购买

VR&#xff08;虚拟现实&#xff09;技术作为一种新兴的技术&#xff0c;正在逐渐改变人们的生活和工作方式。随着技术的不断进步&#xff0c;人们对于元宇宙的概念也越来越感兴趣。元宇宙是一个虚拟世界&#xff0c;通过VR技术可以实现人们在其中进行各种活动和交互。 元宇宙的…

戴尔灵越3000来说2.5G的双核显存能干啥?

吃鸡已经成为大家耳熟能详的网络游戏。 很多人认为&#xff0c;想要享受吃鸡的乐趣&#xff0c;就必须组装一台高端电脑。 虽然配置越高越好&#xff0c;但现实是很多配置都是以性能为标准的。 有余了&#xff0c;没必要刻意追求高配置、高特效。 说实话&#xff0c;吃鸡不一定…

【Qt】:多种方式编辑hello world

多种方式编辑hello world 一.QLabel二.对象树三.使用单行编辑框四.使用按钮 (小技巧&#xff1a;1.可以使用F4来进行头文件和对应cpp文件的切换&#xff1b;2.写完一个函数的声名之后,按下altenter,就可以自动的在对应的cpp 文件中添加函数的定义了.) 一.QLabel 注意这里是QSt…

数据可视化基础与应用-04-seaborn库从入门到精通01-02

总结 本系列是数据可视化基础与应用的第04篇seaborn&#xff0c;是seaborn从入门到精通系列第1-2篇。本系列的目的是可以完整的完成seaborn从入门到精通。主要介绍基于seaborn实现数据可视化。 参考 参考:数据可视化-seaborn seaborn从入门到精通01-seaborn介绍与load_datas…

【SpringCloud】Ribbon负载均衡

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

java多线程中的阻塞队列

一、普通不阻塞队列 还记得队列我们如何实现吗&#xff1f;我们用的是循环队列的方式&#xff0c;回一下&#xff1a; 描述&#xff1a;开始tail和head指针都指向最开始位置&#xff0c;往里面添加元素tail&#xff0c;出元素head 初始状态&#xff1a; put元素后状态 take…

KOSMOS-2.5: A Multimodal Literate Model

KOSMOS-2.5: A Multimodal Literate Model 相关链接&#xff1a;arXiv 关键字&#xff1a;multimodal、literate model、text-intensive images、Transformer architecture、document-level text recognition 摘要 我们介绍了KOSMOS-2.5&#xff0c;这是一个用于机器阅读文本密…

2024知乎广告推广怎么做,知乎推广教程!

随着社交媒体影响力的日益增强&#xff0c;知乎作为中国高质量知识分享社区的代表&#xff0c;已经成为品牌方精准触达目标受众的重要阵地。云衔科技凭借其专业的一站式广告服务能力&#xff0c;为企业提供知乎广告开户及代运营解决方案&#xff0c;助力企业在知乎平台上实现品…

这6个png免抠素材网,免费下载,值得收藏!

找png免抠素材&#xff0c;就上这6个网站&#xff0c;免费下载&#xff0c;可商用。设计师必备&#xff0c;赶紧收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/searchlist/66008----all-0-1.html?vNTYxMjky 网站主要分享设计素材为主。像平面海报、免抠元素、背景图…

前端学习<二>CSS基础——08-CSS属性:定位属性

CSS的定位属性有三种&#xff0c;分别是绝对定位、相对定位、固定定位。 position: absolute; <!-- 绝对定位 -->​position: relative; <!-- 相对定位 -->​position: fixed; <!-- 固定定位 -->​ 下面逐一介绍。 相对定位 相对定位&#xff1a;让…

经典永不过时 Wordpress模板主题

经得住时间考验的模板&#xff0c;才是经典模板&#xff0c;带得来客户的网站&#xff0c;才叫NB网站。 https://www.jianzhanpress.com/?p2484

用xshell或ftp连接本地虚拟机linux系统,centos7修改动态ip地址

如果不知道怎么下载vm本地虚拟机软件或者不知道怎么安装可以参考我上一篇博客 vmWare虚拟机下载安装详细教程,手把手一步一步教学-CSDN博客 安装好虚拟机软件我们想要通过xshell和ftp工具来管理,小黑框不太舒服哈哈哈 一.准备工作 输入命令来查看当前的ip地址 ip addr 可以…

【目标跟踪】红绿灯跟踪

文章目录 一、前言二、结果三、跟踪3.1、检测输入3.2、预测与运动补偿3.3、第一次匹配3.4、第二次匹配3.5、第三次匹配3.6、航迹的起始与信息的发布 四、后记 一、前言 红绿灯场景对当前无人驾驶来说是个灾难性的挑战。暂且不说复杂的十字路口&#xff0c;譬如简单的人行道红绿…

Go语言学习Day6:数组与切片

名人说&#xff1a;莫愁千里路&#xff0c;自有到来风。 ——钱珝 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1. 数组① 什么是数组② 数组的声明③ 初始化数组的几种方式④ 遍历数组元素⑤ 数组为值类型⑥ 数…
最新文章