该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个计算器不使用逆波兰表达式写的,我也不太清楚这个逻辑的工作原理,不知道大家怎么看。能帮忙解释一下运行逻辑最好了
import java.io.*;
import java.util.*;
public class Calculator4_0{
public static void main(String[] args){
BufferedReader reader=null;
InputStreamReader inputStreamReader=null;
try{
System.out.println("欢迎来到计算器");
System.out.println("输入表达式或者输入gg退出程序");
inputStreamReader=new InputStreamReader(System.in);
reader=new BufferedReader(inputStreamReader);
String str=reader.readLine();
while(!str.equals("gg")){
System.out.println("答案是 "+cal(str)+"");
System.out.println("输入表达式或者输入gg退出程序");
str=reader.readLine();
}
}catch(Exception e){
e.printStackTrace();
}
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static float cal(String s) throws Exception{
if(s == null || "".equals(s.trim())) {
return 0f;
}
int a1=s.indexOf("+");
int a2=s.indexOf("-");
int a3=s.indexOf("*");
int a4=s.indexOf("/");
int a5=s.indexOf("(");
if(a1==-1&&a2==-1&&a3==-1&&a4==-1){
if(s.trim()==null||"".equals(s.trim())){
throw new Exception("括号异常");
}
return Float.parseFloat(s.trim());
}
if(a5!=-1){
int a6=s.indexOf(")");
if(a6==-1){
throw new Exception("操作异常");
}else{
float f=cal(s.substring(a5+1,a6).trim());
s=s.replace(s.substring(a5,a6+1), String.valueOf(f));
return cal(s);
}
}
if(a1!=-1){
return cal(s.substring(0,a1))+cal(s.substring(a1+1,s.length()));
}
if(a2!=-1){
return cal(s.substring(0,a2))-cal(s.substring(a2+1,s.length()));
}
if(a3!=-1){
return cal(s.substring(0,a3))*cal(s.substring(a3+1,s.length()));
}
if(a4!=-1){
return cal(s.substring(0,a4))/cal(s.substring(a4+1,s.length()));
}
return Integer.parseInt(s.trim());
}
}