这个计算器并不是基于逆波兰实现的,而是通过简单的递归,一层一层地计算最终求得结果。
具体的图形化界面可以参考我的另外一个篇博客:基于逆波兰表达式实现图形化混合计算器,这里我只是简单的介绍一下怎样求得算术表达式的结果,另外如果有需要可以加入另外那个博客中的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();
}
}