java实现计算器(带括号)
@Test
public void test8(){
String s="((5+4)*6/2)+1";
System.out.println(s);
String newString = getNewString(s);
Double aDouble = operationBase(newString);
System.out.println(s+"="+aDouble);
}
//打印结果
((5+4)*6/2)+1
5+4=9.0 第一层递归
9.0*6/2=27.0 第二层
27.0+1=28.0 最后
((5+4)*6/2)+1=28.0
把包含括号的运算转成无括号运算
private String getNewString(String s) {
//左括号
List<Integer> leftList = new ArrayList<>();
//右括号
List<Integer> rightList = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
String s1 = s.charAt(i) + "";
if (s1.equals("(")) {
leftList.add(i);
}else if (s1.equals(")")){
rightList.add(i);
}
}
Integer left = leftList.get(leftList.size() - 1);
Integer right = rightList.get(0);
int index=1;
while (left>right){
right=rightList.get(index);
index++;
}
//每层计算出最里面的括号值参与运算
String substring = s.substring(left+1, right);
Double aDouble = operationBase(substring);
s = s.substring(0, left) + aDouble + s.substring(right+1, s.length());
if(s.contains("(")){
String newString = getNewString(s);
if(!newString.contains("(")){
return newString;
}
}
return s;
}
计算无括号的基本运算
public Double operationBase(String s) {
// String s = "15+6*7/2+1-5/2+2";
//以加法为基础切割
String[] split = s.split("\\+");
double sum = 0;
for (int i = 0; i < split.length; i++) {
String s1 = split[i];
//如果是纯数字数字直接加
if (checkt(s1)) {
sum = sum + Double.valueOf(s1);
} else {
//处理切割里面的减法,相当于切割后出现(1-5/2)的计算
double reduce = 0;
String[] split1 = s1.split("-");
for (int j = 0; j < split1.length; j++) {
String s2 = split1[j];
//如果只是数字直接参与计算
if (checkt(s2)) {
if (j == 0) {
if(split1.length==2&&split1[0].equals("")){
if(!s2.equals("")) {
reduce = reduce - Double.valueOf(split1[1]);
}
}else {
reduce = reduce + Double.valueOf(s2);
}
} else {
if(!s2.equals("")) {
reduce = reduce - Double.valueOf(s2);
}
}
}else {
//如果包含乘除切割计算
double ct=1;
String[] split2 = s2.split("\\*");
for (int m = 0; m < split2.length; m++) {
String s3 = split2[m];
String[] split3 = s3.split("\\/");
if(split3.length>1){
double delete= Double.parseDouble(split3[0]);
for (int k = 1; k < split3.length; k++) {
delete= delete / Double.valueOf(split3[k]);
}
ct=ct*delete;
}else {
ct=ct*Double.valueOf(s3);
}
}
if(split1.length==1){
reduce=reduce+ct;
}else {
reduce=reduce-ct;
}
}
}
sum = sum +reduce;
}
}
System.out.println(s+"="+sum);
return sum;
}
检查是否只剩加号运算
public Boolean checkt(String s){
if(s.contains("*")){
return false;
}else if(s.contains("/")){
return false;
}else if (s.contains("-")){
return false;
}
return true;
}