public String callist(List<String> expl){
while(expl.size()>1){
if(isnum(expl.get(0))&&isnum(expl.get(2))&&isoper(expl.get(1))){
BigDecimal num1= new BigDecimal(expl.get(0));
BigDecimal num2= new BigDecimal(expl.get(2));
BigDecimal ans=BigDecimal.valueOf(0);
char oper=expl.get(1).charAt(0);
switch(oper){
case'+':ans=num1.add(num2);
case'-':ans=num1.subtract(num2);
case'*':ans=num1.multiply(num2);
case'/':{
if(num2.equals(BigDecimal.valueOf(0))){
errvalue="除数不能为0";
return "0";
}
else ans=num1.divide(num2, 8, BigDecimal.ROUND_HALF_UP);
}
case'^':{
if(new BigDecimal(num1.intValue()).compareTo(num1)==0|| num1.compareTo(BigDecimal.valueOf(0)) < 0||num1.compareTo(BigDecimal.valueOf(1024)) > 0){
errvalue="powerror";
return "0";
}
else {
ans=num1.pow(num2.intValue());
}
}
}
expl.set(0,ans.toString());
expl.remove(1);
expl.remove(2);
}
else {
errvalue="无法识别算式";
return "0";
}
}
return expl.get(0);
}
public List<String> calbrak(String exp){
List<String> nums = new ArrayList<>();
if(exp.isEmpty()){
errvalue="算式为空";
}
if(isoper(exp.charAt(0))||isoper(exp.charAt(exp.length()-1))||exp.charAt(0)==')'||exp.charAt(exp.length()-1)=='('){
errvalue="无法识别算式";
return nums;
}
while(exp.contains("(")||exp.contains(")")){
if(exp.contains("(")&&!exp.contains(")")||exp.contains(")")&&!exp.contains("(")){
errvalue="无法识别算式";
return nums;
}
int i=0;
while(i<exp.length()){
if(isnum(exp.charAt(i))){
int j = i;
while(isnum(exp.charAt(i)))i++;
nums.add(nums.size(),exp.substring(j,i));
if(exp.charAt(i+1)=='(')nums.add("*");
}
if(isoper(exp.charAt(i)))nums.add(nums.size(),String.valueOf(exp.charAt(i)));
if(exp.charAt(i)=='('){
int j = i;
while(exp.charAt(i)!=')'){
if(exp.charAt(i)=='(')j=i;
i++;
}
if(j == i + 1)continue;
else nums.addAll(nums.size(),calbrak(exp.substring(j+1,i-1)));
}
if(isnum(exp.charAt(i)))
i++;
}
}
return nums;
}
现在第二个函数返回的List是空的,不知道为什么