這個計算器並不是基於逆波蘭實現的,而是通過簡單的遞歸,一層一層地計算最終求得結果。
具體的圖形化界面可以參考我的另外一個篇博客:基於逆波蘭表達式實現圖形化混合計算器,這裏我只是簡單的介紹一下怎樣求得算術表達式的結果,另外如果有需要可以加入另外那個博客中的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();
}
}