表达式求值(可以计算两位数以上)

news2024/10/5 21:23:14

此程序可计算两位数以上的表达式


import java.util.Stack;

public class ExpressionEvaluator {

    public int evaluate(String s) {
        Stack<Integer> numbers = new Stack<>();
        Stack<Character> operators = new Stack<>();
        int i = 0;
        char c = s.charAt(i);

        while (c==' '){
            i++;
            c = s.charAt(i);
        }
        if (!In(c)) {
            int d = c -'0';
            i++;
            while (i<s.length()&&!In(s.charAt(i))&&s.charAt(i)!=' '){
                d=d*10+(s.charAt(i)-'0');
                i++;
            }
            numbers.push(d);
        } else {
            operators.push(c);
            i++;
        }
        while ( i != s.length()) {

            c = s.charAt(i);
            if(c == ' '){
                i++;
                continue;
            }
            if (!In(c)) {
                int d = c -'0';
                i++;
                while (i<s.length()&&!In(s.charAt(i))&&s.charAt(i)!=' '){
                    d=d*10+(s.charAt(i)-'0');
                    i++;
                }
                numbers.push(d);

            } else if (operators.isEmpty()) {
                operators.push(c);
                i++;
            } else {
                switch (Precede(operators.peek(), c)) {
                    case '<':
                        operators.push(c);
                        i++;
                        break;
                    case '>':
                        char theta = operators.pop();
                        int a = numbers.pop();
                        int b = numbers.pop();
                        numbers.push(evalSingleOp(b, a, theta));
                        break;
                    case '=':
                        operators.pop();
                        i++;
                        break;
                }
            }
        }

        while (!operators.isEmpty()){
            char theta = operators.pop();
            int a = numbers.pop();
            int b = numbers.pop();
            numbers.push(evalSingleOp(b, a, theta));
        }

        return numbers.pop();
    }

    public char Precede(char a, char b) {//判断操作符的优先级
        switch (a) {//先算最厉害的
            case '+':
            case '-':
                if ((b == '*') || (b == '/') || (b == '('))
                    return '<';
                else
                    return '>';
            case '/':
            case '*':
                if (b == '(')
                    return '<';
                else
                    return '>';
            case '(':
                if (b == ')')
                    return '=';
                else
                    return '<';
            case ')':
                return '>';
            default:
                throw new RuntimeException("运算符优先级错误");
        }
    }

    public boolean In(char ch) {//判断是操作数还是操作符
        int i;
        char[] p = new char[]{'+', '-', '*', '/', '(', ')'};
        for (i = 0; i < 6; i++)
            if (ch == p[i]) return true;
        return false;
    }

    private int evalSingleOp(int a, int b, char op) {//计算表达式
        switch (op) {
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                return a / b;
            default:
                throw new IllegalStateException("Unexpected operator: " + op);
        }
    }

    public static void main(String[] args) {
        ExpressionEvaluator evaluator = new ExpressionEvaluator();
        System.out.println("(1+3)*((2+5)-4)*2="+evaluator.evaluate("(1+3)*((2+5)-4)*2"));
        System.out.println("1+3*2+5-4*2="+evaluator.evaluate("1+3*2+5-4*2"));
        System.out.println("100*2*3="+evaluator.evaluate("100*2*3"));
    }
}

结果如图

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

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

相关文章

stm32定时器中断和外部中断

一&#xff0c;中断系统的介绍 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 中…

平衡二叉树——AVl树

AVL树 AVl树的概念AVL树的实现AVL树的结构AVl树的插入AVL树的旋转左单旋右单旋左右双旋右左双旋 AVl树以高度递归实现完整代码 AVl树的概念 AVL树是一种自平衡的二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;&#xff0c;由两位苏联数学家 Georgy Adelson-Velsk…

jQuery——事件处理

1、事件绑定&#xff08;2种&#xff09; ① eventName&#xff08;function&#xff08;&#xff09;{ }&#xff09; 绑定对应事件名的监听&#xff0c;例如&#xff1a;$&#xff08;‘#div’&#xff09;. click&#xff08;function&#xff08;&#xff09;{ }&#xf…

【复习】CSS中的选择器

文章目录 东西有点多 以实战为主选择器盒子模型 东西有点多 以实战为主 选择器 CSS选择器&#xff08;CSS Selectors&#xff09;是用于在HTML或XML文档中查找和选择元素&#xff0c;以便应用CSS样式的一种方式。 元素选择器&#xff08;Type Selector&#xff09; 选择所有…

在谷歌colab运行YOLO系列(重要比在云服务器搭建运行快)

在谷歌colab运行YOLO系列&#xff08;重要比在云服务器搭建运行快&#xff09; 一、谷歌云硬盘二、克隆 YOLOV5进行运行测试1&#xff0c;修改prepare文件中的参数2&#xff0c;修改voc.yaml3&#xff0c;修改yolov5s.yaml4&#xff0c;防止colab自动断开的方式&#xff08;必须…

今日指数项目个股描述功能实现

个股描述功能实现 1 个股描述功能实现说明 1&#xff09;原型示意 2&#xff09;接口说明 功能描述&#xff1a;个股主营业务查询接口 服务路径&#xff1a;/api/quot/stock/describe 服务方法&#xff1a;GET 请求参数&#xff1a;code #股票编码 响应参数&#xff1a; {…

Koa2项目实战3 (koa-body,用于处理 HTTP 请求中的请求体)

以用户注册接口为例&#xff0c;需要在请求里携带2个参数&#xff1a;用户名&#xff08;user_name&#xff09;和密码&#xff08;password&#xff09;。 开发者需要在接口端&#xff0c;解析出user_name 、password。 在使用Koa开发的接口中&#xff0c;如何解析出请求携带…

八、Drf解析器

八、解析器 8.1概念 解析用户请求发送过来的数据&#xff08;常用的是JSON&#xff09; 请求类型&#xff1a; get: ​ 方式1&#xff1a; http://127.0.0.1/web/?arg1v1&arg2v2 ​ 方式2&#xff1a;通过请求头发送 post: ​ 请求头&#xff1a; ​ content-typ…

数据库管理-第247期 23ai:全球分布式数据库-Schema对象(20241004)

数据库管理247期 2024-10-04 数据库管理-第247期 23ai&#xff1a;全球分布式数据库-Schema对象&#xff08;20241004&#xff09;1 分区、表空间和Chunk&#xff08;块&#xff09;2 表空间组3 分片表4 分片表族5 复制表6 在所有分片上创建的非表对象总结 数据库管理-第247期 …

C++——模板进阶、继承

文章目录 一、模板1. 非类型模板参数2. 模板的特化函数模板特化类模板特化1. 全特化2. 偏特化部分特化参数更进一步的限制 二、继承1. 概念2. 定义定义格式 3. 继承基类成员访问⽅式的变化4. 继承类模板5.基类和派⽣类间的转换6. 继承中的作⽤域隐藏规则&#xff1a; 7. 派⽣类…

LinuxO(1)调度算法

概念 在Linux中&#xff0c;O(1)调度算法是一种进程调度算法。O(1)表示算法的时间复杂度是常数级别的&#xff0c;与系统中的进程数量无关。 运行队列结构 他采用了两个运行队列&#xff0c;一个活动队列和一个过期队列。活动队列中的进程是有资格获取CPU时间片的进程&#x…

阳台山足球营地的停车位探寻

阳台山足球营地的环境是真好哈。停车场名称&#xff1a;阳台山森林公园配套停车场。应该很多爬山的人车子也停在这里。而且我没想到的&#xff0c;阳台山的山泉水还有不少居民每天提着空桶去山上装。看来环境是真的很好哈 停车场有地面和地下停车场&#xff0c;停车位个数查不…

Linux驱动开发(速记版)--设备模型

第八十章 设备模型基本框架-kobject 和 kset 80.1 什么是设备模型 设备模型使Linux内核处理复杂设备更高效。 字符设备驱动适用于简单设备&#xff0c;但对于电源管理和热插拔&#xff0c;不够灵活。 设备模型允许开发人员以高级方式描述硬件及关系&#xff0c;提供API处理设备…

若依使用(二次开发)

RouYi-MT RouYi-MT下载&#xff1a; 下载地址 RouYi-MT的使用&#xff08;修改若依代码中文件夹得统一包名&#xff09; 将对应的Springboot文件压缩成压缩包。 填写对应的参数&#xff0c;生成修改后的文件。 开发步骤 1.创建子项目到RouYi-springboot中&#xff0c;添加…

简单易懂的springboot整合Camunda 7工作流入门教程

简单易懂的Spring Boot整合Camunda7入门教程 因为关于Spring Boot结合Camunda7的教程在网上比较少&#xff0c;而且很多都写得有点乱&#xff0c;很多概念写得太散乱&#xff0c;讲解不清晰&#xff0c;导致看不懂&#xff0c;本人通过研究学习之后就写出了这篇教学文档。 介…

我的创作纪念日一年

目录 机缘 收获 日常 成就 憧憬 机缘 我之所以开始写CSDN博客&#xff0c;源于一段特殊的时光。去年此时&#xff0c;我独自待在实验室&#xff0c;周围的世界仿佛与我无关。没有旅游&#xff0c;没有与朋友的欢聚&#xff0c;情感的挫折和学业的压力如潮水般袭来。在这样的…

2025舜宇招聘【内推码】

【2025内推码】 DSwNQ9yu DSJXN8Mr 舜宇集团2025届全球校园招聘正式启动&#xff01;&#xff01;&#xff01; 专业需求&#xff1a;机械、自动化、电子、电气、通信、控制、测控、计算机、软件、物理、光学等专业&#xff1b; 工作地点&#xff1a;宁波余姚、浙江杭州、广东…

97. UE5 GAS RPG 实现闪电链技能(二)

书接上回&#xff0c;如果没有查看上一篇文章的同学推荐先看上一章&#xff0c;我们接着实现闪电链技能。 在上一章最后&#xff0c;我们实现了闪电链的第一条链&#xff0c;能够正确显示特效&#xff0c;接下来&#xff0c;我们先实现它的音效和一些bug修复。 我们在多端网络里…

(9)MATLAB瑞利衰落信道仿真2

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、瑞利衰落信道二、瑞利衰落信道建模三、仿真结果二、高斯随机变量和瑞利随机变量后续 前言 本文首先给出瑞利衰落信道模型&#xff0c;并根据瑞利衰落变量估…

乌班图基础设施安装之Mysql8.0+Redis6.X安装

简介&#xff1a;云服务器基础设施安装之 Mysql8.0Redis6.X 安装 Docker安装 # 按照依赖 yum install -y yum-utils device-mapper-persistent data lvm2 Docker Mirror 从去年开始. hub.docker.com[1] 在国内的访问速度极慢. 当时大家主要还是依赖国内的一些镜像源: 如中科…