这个计算器并不是基于逆波兰实现的,而是通过简单的递归,一层一层地计算最终求得结果。

具体的图形化界面可以参考我的另外一个篇博客:基于逆波兰表达式实现图形化混合计算器,这里我只是简单的介绍一下怎样求得算术表达式的结果,另外如果有需要可以加入另外那个博客中的Check方法,来检查表达式的合法性。

计算表达式的算式如下所示(GitHub仓库地址):

import java.math.BigDecimal;
import java.util.Scanner; public class Calculator {
private String expression;
public static void main(String[] args) {
System.out.print("输入算式:");
Scanner scanner = new Scanner(System.in);
String express = scanner.nextLine();
Calculator calculator = new Calculator(express);
System.out.println(calculator.Calculated());
}
public Calculator(String expression) {
this.expression = expression;
}
public String Calculated() {
if (expression == null || expression.trim().equals("")) { //如果算式为空,返回"0"
return "0";
}
int a1 = expression.indexOf("+"); //求出第一个"+"的位置
int a2 = expression.indexOf("-"); //求出第一个"-"的位置
int a3 = expression.indexOf("*"); //求出第一个"*"的位置
int a4 = expression.indexOf("/"); //求出第一个"/"的位置
int a5 = expression.indexOf("("); //求出第一个"("的位置
int a6 = expression.lastIndexOf(")"); //求出最后一个")"的位置
//如果都不存在
if (a1 == -1 && a2 == -1 && a3 == -1 && a4 == -1 && a5 == -1 && a6 == -1) {
if (expression.trim() == null || expression.trim().equals("")) { //如果为空,返回Error!
return "Error";
}
return expression.trim(); //直接返回
}
if (a5 != -1 && a6 > a5) { //存在配对的括号
//计算出括号里面的内容
String str = new Calculator(expression.substring(a5 + 1, a6).trim()).Calculated();
if (str.equals("Error!")) {//如果返回"Error!",有可能是()()这种形式
a6 = expression.indexOf(")"); //得到第一个")"位置
if (a6 > a5) {//如果右括号在左括号的右边
//计算出括号里面的内容
str = new Calculator(expression.substring(a5 + 1, a6).trim()).Calculated();
if (str.equals("Error!")) //如果得到"Error!"
return str; //直接返回
}
else return "Error!";
}
expression = expression.replace(expression.substring(a5, a6 + 1), str);
return new Calculator(expression).Calculated();
}
else if (a5 != -1 || a6 != -1) //括号不匹配
return "Error!";
if (a1 != -1) { //有加号
String str1 = new Calculator(expression.substring(0, a1)).Calculated();
String str2 = new Calculator(expression.substring(a1 + 1, expression.length())).Calculated();
//如果其中一个返回"Error!",直接返回"Error!"
if (str1.equals("Error!") || str2.equals("Error!"))
return "Error!";
//计算
return String.valueOf(Double.parseDouble(str1) + Double.parseDouble(str2));
}
if (a2 != -1) { //有减号
String str1 = new Calculator(expression.substring(0, a2)).Calculated();
String str2 = new Calculator(expression.substring(a2 + 1, expression.length())).Calculated();
//如果其中一个返回"Error!",直接返回"Error!"
if (str1.equals("Error!") || str2.equals("Error!"))
return "Error!";
//计算
return String.valueOf(Double.parseDouble(str1) - Double.parseDouble(str2));
}
if (a3 != -1) { //有乘号
String str1 = new Calculator(expression.substring(0, a3)).Calculated();
String str2 = new Calculator(expression.substring(a3 + 1, expression.length())).Calculated();
//如果其中一个返回"Error!",直接返回"Error!"
if (str1.equals("Error!") || str2.equals("Error!"))
return "Error!";
//计算
return String.valueOf(Double.parseDouble(str1) * Double.parseDouble(str2));
}
if(a4 != -1) { //有除号
String str1 = new Calculator(expression.substring(0, a4)).Calculated();
String str2 = new Calculator(expression.substring(a4 + 1, expression.length())).Calculated();
//如果其中一个返回"Error!"或除数为0,直接返回"Error!"
if (str1.equals("Error!") || str2.equals("Error!") || Double.parseDouble(str2) == 0.0)
return "Error!";
//舍入计算
BigDecimal a = new BigDecimal(Double.parseDouble(str1));
BigDecimal b = new BigDecimal(Double.parseDouble(str2));
return a.divide(b, 5, BigDecimal.ROUND_HALF_UP).toString();
}
return expression.trim();
}
}

Java实现简单混合计算器的更多相关文章

  1. 01.Java 开发简单的计算器

    难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习一. 实验介绍1.1 实验内容本次实验利用Java开发一个可以进行简单的四则运算的图形化计算器,会使用到 Java Swing ...

  2. Java 最简单的计算器——使用Args参数

    public class Test{ public static void main(String[] args){ if(args.length<3){ System.out.println( ...

  3. Java对象简单实用(计算器案例)

    对 Java中的对象与属性,方法的使用,简单写了个案例 import java.util.Scanner; class Calculste { int a; //定义两个整数 int b; Strin ...

  4. Java简单公式计算器

    最近给公司开发业务代码时,碰到一个场景,简单描述是这样的: 客户要向咱们公司定制一件产品,这个产品呢,有很多属性,那公司得根据这些属性报价呀,怎么报价呢?公司针对某种类型的产品有一个基准价,在同类产品 ...

  5. jsp学习---使用jsp和JavaBean实现超简单网页计算器

    一.需求 如题,用jsp实现一个超简单的网页计算器. 二.实现 1.效果图 1)初始界面: 2)随便输入两个数进行相乘: 3)当除数为零时提示报错: 2.代码 Calculator.java pack ...

  6. android之Java+html+javascript混合开发

    android开发,除了使用原生态的开发方式之外,还可以使用java+html+javascript混合开发的方式来开发,这样可以节省大量的开发时间,同时还可以使不同设备的用户获得相同的用户体验.好了 ...

  7. java课程设计(计算器)

    JAVA课程 设 计 报 告 1206401-18   瞿杰 一.设计时间 2013年6月 24日-----6月28日 二.设计地点 湖南城市学院实验楼计算机506机房 三.设计目的 1.巩固学习VB ...

  8. HDU1237 简单的计算器 【堆】+【逆波兰式】

    简单的计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  9. 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

    从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Calibu ...

随机推荐

  1. java web 下载文件 response.setHeader()的用法 (转载)

    response.setHeader()的用法 response.setHeader()下载中文文件名乱码问题 收藏 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但 ...

  2. 2020-04-11:A系统联机同步调用B系统(A和B不是同一公司系统,不能用分布式事务),如何保证系统间数据准实时一致性(设计思路即可)?提醒:需要考虑调用超时、并发、幂等、反交易先到等问题

    福哥答案2020-04-12: 可参考微信支付和支付宝支付.

  3. C#LeetCode刷题之#453-最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3877 访问. 给定一个长度为 n 的非空整数数组,找到让数组所有 ...

  4. Vue 离开页面时的校验-mixin-beforeRouteLeave

    一定要看下函数前的注释, 需要在使用的页面定义[needCheckFlag]data属性 一定要看下函数前的注释, 需要在使用的页面定义[needCheckFlag]data属性 一定要看下函数前的注 ...

  5. Es6扩展运算符--三点运算符(...)--展开语法(Spread syntax)

    0.看文档呀 关于拓展运算符更详细的解释见 > MDN展开语法 关于剩余参数更详细的解释见 >MDN剩余参数 关于解构赋值更详细的解释见 >MDN解构赋值 直接看上面的文档更好 1. ...

  6. dota2输入法无候选框?

    win10自带的微软拼音在dota2中不会显示候选框,或者说是选词框. 这种情况下只能选择其他输入法. 我选择的是搜狗输入法(此随笔添加时的最新版),在dota2中有选词框. 网上有些人说要改兼容性, ...

  7. Android Studio gridview 控件使用自定义Adapter, 九宫格items自适应全屏显示

    先看效果图,类似于支付宝首页的效果.由于九宫格显示的帖子网上已经很多,但是像这样九宫格全屏显示的例子还不是太多.本实例的需求是九宫格全屏显示,每个子view的高度是根据全屏高度三等分之后自适应高度,每 ...

  8. Linux 查网关和dns命令

    一,查看网关(缺省路由)方法: 1.route -n 或netstat -rn2.ip route show  二, 查看DNS: nslookup www.baidu.com

  9. 计算机网络-链路层(2)多路访问控制协议(multiple access control protocol)

    单一共享广播信道,如果两个或者两个以上结点同时传输,会互相干扰(interference) 冲突(collision):结点同时接收到两个或者多个信号→接收失败! MAC协议采用分布式算法决定结点如何 ...

  10. mac安装conda后,终端的用户名前面有一个(base),最佳解决方案

    mac安装了conda后,前面会有一个(base),很烦人,终于找到最佳解决方案了: $ conda config --set auto_activate_base false 原因: 安装conda ...