java实现简易计算器功能

Java实现简易计算器功能

在Java中实现简易计算器功能可以通过控制台输入运算式并得到结果的方式实现。主要步骤包括解析输入的运算式、进行计算并返回结果。

解析运算式

为了解析运算式,需要将输入的运算式字符串转换成可计算的形式。可以使用Java自带的eval()方法进行转换,例如:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
String expression="1+2*3";
double result = (Double) engine.eval(expression);
System.out.println(result);

其中,ScriptEngineManager和ScriptEngine是Java中提供的用于将字符串转换为可执行代码的工具类。通过getEngineByName()方法获取js类型的ScriptEngine,并将字符串"1+2*3"赋值给变量expression。最后使用eval()方法运行代码,并返回结果。

实现计算器功能

解析运算式后,需要针对输入的运算式进行计算,得出结果。以四则运算为例,可以通过栈来实现计算器功能。首先需要定义两个栈:一个存储运算符的栈和一个存储数字的栈。接下来,遍历运算式中的每一个字符,如果该字符是数字,则将其压入数字栈中;如果该字符是运算符,则需要和运算符栈中的栈顶元素进行比较,如果该运算符的优先级比栈顶元素高,则将该运算符压入运算符栈中;如果该运算符的优先级比栈顶元素低或相等,则需要将栈顶元素弹出并进行运算,然后将计算结果压入数字栈中。最后,运算式遍历完成后,数字栈中仅剩一个元素,即为运算的结果。

示例1:计算3+5-2

String expression="3+5-2";
//创建两个栈
Stack<Double> numStack=new Stack<>();
Stack<Character> optStack=new Stack<>();
for(int i=0;i<expression.length();i++){
    char c=expression.charAt(i);
    //如果该字符是数字,则将其压入数字栈中
    if(Character.isDigit(c)){
        numStack.push((double)c-'0');
    }else{
        while(!optStack.isEmpty()&&getPriority(optStack.peek())>=getPriority(c)){
            double num2=numStack.pop();
            double num1=numStack.pop();
            char opt=optStack.pop();
            double result=calculate(num1,num2,opt);
            numStack.push(result);
        }
        optStack.push(c);
    }
}
while(!optStack.isEmpty()){
    double num2=numStack.pop();
    double num1=numStack.pop();
    char opt=optStack.pop();
    double result=calculate(num1,num2,opt);
    numStack.push(result);
}
double result=numStack.pop();
System.out.println(result);

示例2:计算(3+5)*2

String expression="(3+5)*2";
//创建两个栈
Stack<Double> numStack=new Stack<>();
Stack<Character> optStack=new Stack<>();
for(int i=0;i<expression.length();i++){
    char c=expression.charAt(i);
    //如果该字符是数字,则将其压入数字栈中
    if(Character.isDigit(c)){
        numStack.push((double)c-'0');
    }else if(c=='('){
        //如果该字符是左括号,则将其压入运算符栈中
        optStack.push(c);
    }else if(c==')'){
        //如果该字符是右括号,则将运算符栈中的运算符依次出栈并进行计算
        while(optStack.peek()!='('){
            double num2=numStack.pop();
            double num1=numStack.pop();
            char opt=optStack.pop();
            double result=calculate(num1,num2,opt);
            numStack.push(result);
        }
        //将左括号出栈
        optStack.pop();
    }else{
        //如果该字符是运算符,则需要和运算符栈中的栈顶元素进行比较
        while(!optStack.isEmpty()&&getPriority(optStack.peek())>=getPriority(c)){
            double num2=numStack.pop();
            double num1=numStack.pop();
            char opt=optStack.pop();
            double result=calculate(num1,num2,opt);
            numStack.push(result);
        }
        optStack.push(c);
    }
}
while(!optStack.isEmpty()){
    double num2=numStack.pop();
    double num1=numStack.pop();
    char opt=optStack.pop();
    double result=calculate(num1,num2,opt);
    numStack.push(result);
}
double result=numStack.pop();
System.out.println(result);

以上就是Java实现简易计算器功能的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现简易计算器功能 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • java搜索无向图中两点之间所有路径的算法

    Java搜索无向图中两点之间所有路径的算法 算法思路 该算法使用深度优先搜索来查找两个节点之间的所有路径。在搜索期间,对于每个遍历到的未访问节点,我们可以标记它为已访问,并沿着它的所有未访问邻居递归搜索。在这个过程中,我们将到达一个目标节点作为目标终点,或遍历了所有的节点,这代表着没有路径可以到达目标终点,此时我们就回溯到上一步去探索其它可能的路径,直到找到…

    Java 2023年5月26日
    00
  • Java Spring Bean的生命周期管理详解

    Java Spring Bean的生命周期管理详解 简介 在使用Spring框架时,Bean(实例)的生命周期管理是非常重要的,它涉及到Bean的创建、初始化、依赖注入、方法调用、销毁等过程。本文将详细介绍Java Spring中Bean的生命周期管理机制,帮助读者更好地理解和使用Spring框架。 生命周期阶段 在Spring框架中,Bean的生命周期可以…

    Java 2023年5月31日
    00
  • 关于spring boot整合kafka+注解方式

    下面是关于Spring Boot整合Kafka+注解方式的完整攻略。 1. 引入依赖 首先,我们需要在Maven或Gradle中引入Spring Boot和Kafka的依赖。在Maven中,需要在pom.xml中引入以下依赖: <!– Spring Boot –> <dependency> <groupId>org.s…

    Java 2023年5月20日
    00
  • jquery实现联想词搜索框和搜索结果分页的示例

    首先,需要明确的是,jQuery 是一个 JavaScript 函数库,其目的是使JavaScript的使用更容易,简洁。使用 jQuery 可以帮助我们更快捷地编写出与原生 JavaScript 相同的功能。 要实现一个联想词搜索框和搜索结果分页,大致可以分为以下几个步骤: 1. 设计 UI 首先,我们需要设计一下我们的页面 UI,包括搜索框、搜索结果展示…

    Java 2023年6月15日
    00
  • java实现哈夫曼压缩与解压缩的方法

    Java实现哈夫曼压缩与解压缩的方法 哈夫曼编码是一种有效的无损压缩算法,常用于压缩文本文件等数据。本文将详细介绍如何使用Java实现哈夫曼压缩与解压缩的方法。 哈夫曼压缩 1. 构建哈夫曼树 首先需要构建一个哈夫曼树,该树的每个叶子节点都代表一个字符,并且每个叶子节点的编码都是唯一的。构建哈夫曼树的过程如下: 统计给定文本中每个字符出现的频率。 将字符频率…

    Java 2023年5月20日
    00
  • 解决mybatis-plus自动配置的mapper.xml与java接口映射问题

    针对“解决mybatis-plus自动配置的mapper.xml与java接口映射问题”,我给出以下完整攻略,主要分为两个部分: 1. 配置XML文件路径 mybatis-plus默认情况下会在classpath:/mapper/下寻找对应的mapper.xml文件,因此需要确保xml文件路径正确。 可以使用如下方式在application.yml或appl…

    Java 2023年5月20日
    00
  • 深入理解TextView实现Rich Text–在同一个TextView设置不同字体风格

    深入理解TextView实现Rich Text的攻略如下: 1. 了解Spannable接口 TextView实现富文本的关键在于使用Spannable接口。Spannable是一个接口,用于控制文本的呈现方式,可以在TextView中实现不同的文本样式。 Spannable接口提供了许多实现富文本的方法,如ForegroundColorSpan、Backg…

    Java 2023年5月26日
    00
  • Java使用JDBC驱动连接MySQL数据库

    以下是Java使用JDBC驱动连接MySQL数据库的完整攻略: 1. 下载JDBC驱动 首先,我们需要下载合适的JDBC驱动程序。可以在官方网站下载最新的JDBC驱动程序。下载后将其解压缩到本地磁盘。 2. 创建MySQL数据库 我们需要在本地的MySQL数据库中创建一个数据库供使用。如果您的系统中尚未安装MySQL数据库,需要在官方网站下载并安装,安装过程…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部