java实现简易计算器功能

yizhihongxing

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日

相关文章

  • SpringBoot使用Captcha生成验证码

    下面是SpringBoot使用Captcha生成验证码的完整攻略。 1. 引入依赖 在pom.xml文件中引入Captcha依赖: <dependency> <groupId>com.github.yingzhuo</groupId> <artifactId>captcha</artifactId>…

    Java 2023年5月20日
    00
  • Spring Security实现添加图片验证功能

    Spring Security是一个非常强大的安全框架,提供了很多实用的安全特性,可以使web应用程序更加安全可靠。其中,添加图片验证功能可以提高网站的安全性。下面是实现添加图片验证功能的完整攻略。 步骤一:添加依赖 在pom.xml文件中添加如下依赖: <dependency> <groupId>org.springframewor…

    Java 2023年5月20日
    00
  • Windows 下修改Tomcat jvm参数的方法

    完整攻略:Windows下修改Tomcat jvm参数的方法 1. 概述 Tomcat是一个非常常用的Java Web应用服务器,我们可以通过修改Tomcat的jvm参数来进行性能优化或解决一些启动或运行时遇到的问题。本文将介绍在Windows环境下如何修改Tomcat的jvm参数的方法和注意事项。 2. 修改方法 2.1 直接在命令行中设置jvm参数 我们…

    Java 2023年6月2日
    00
  • net操作access数据库示例分享

    下面是详细的“net操作access数据库示例分享”的攻略。 简介 在使用.NET框架进行开发时,经常需要操作数据库。使用.NET操作Access数据库可以使用两种方式:OleDb和Odbc。OleDb适用于Access、Excel和SQL Server等数据库,而Odbc适用于通用数据库。下文将以OleDb方式为例,分享操作Access数据库的示例。 前置…

    Java 2023年5月19日
    00
  • quartz时间表达式Cron详解

    Quartz 时间表达式 Cron 详解 1. Cron 表达式语法 Cron 表达式是一个字符串,包含了六个时间元素和一个可选的第七个元素,决定了任务的触发时间。每个时间元素以空格分隔,格式为: 秒(0~59) 分钟(0~59) 小时(0~23) 日(1~31) 月(1~12) 星期(0~7) 其中星期可以使用数字(0~7)来表示,也可以使用英文缩写(SU…

    Java 2023年5月20日
    00
  • Java多线程-线程的同步与锁的问题

    Java 多线程 – 线程的同步与锁的问题 Java 中,线程的同步与锁是多线程开发中一个极为重要的概念,也是高并发环境下解决数据同步的关键。线程的同步意味着多个线程之间共享数据时需要做到同步,避免数据错乱。锁是线程同步机制的基础,通过加锁可以使线程按照特定的次序串行执行,从而保证多线程访问共享数据时的安全性。 线程同步 当多个线程不同步访问共享数据时,就可…

    Java 2023年5月26日
    00
  • Java中的Vector和ArrayList区别及比较

    Java中的Vector和ArrayList区别及比较 1. Vector和ArrayList的区别 Vector和ArrayList是Java集合框架中两个常用的数组实现类,它们的区别主要有以下几点: 1.1 线程安全 Vector是线程安全的,而ArrayList不是线程安全的。这是由于Vector中的方法都是用synchronized关键字修饰的,而A…

    Java 2023年5月26日
    00
  • SpringBoot spring.factories加载时机分析

    在SpringBoot中,spring.factories文件是一种特定的配置文件,用于向Spring容器中加载自定义的配置类或者自动配置组件。 什么是SpringBoot spring.factories文件 spring.factories文件位于META-INF目录下,它是SpringBoot用来实现自动配置的一个重要组件。该文件被用于对Spring加…

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