该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
把代码优化了下(ps:尽量的减少了冗余度)并添加了注释,顺便强化了下功能,现在可以实现识别括号,加减乘除,还有次方
public class Three {
public static void main(String[] args) {
caculatorPlus("3+(5*(2+6)+1)-2");
caculatorPlus("1+2*3-4");
caculatorPlus("60/3-8/4+5");
caculatorPlus("5*(2+6)+1+(2+4)/2");
caculatorPlus("5*(2+6)/+1+(2+4)/2");
caculatorPlus("1+2*3^2-4");
caculatorPlus("1+(2*3)^2-4*(5+6)");
}
/**
* 能识别括号的计算器
* @param str 字符串表达式
*/
public static void caculatorPlus(String str){
String strTemp="";
StringBuffer bfTemp=new StringBuffer(str);//处理str的过渡StringBuffer变量
int count=str.length()-str.replace("(", "").length();//记录括号数
int leftIndex=0;//记录左括好的位置
int rightIndex=0;//记录右括好的位置
//防止输入异常
try{
//遍历所有括号的内容
for(int j=1;j<=count;j++){
//获取最内层的左括号位置
for(int i=bfTemp.length()-1;i>=0;i--){
if(bfTemp.charAt(i)=='('){
leftIndex=i;
break;
}
}
//获取最内层的右括号位置
for(int i=leftIndex+1;i
if(bfTemp.charAt(i)==')'){
rightIndex=i;
break;
}
}
strTemp=caculator(bfTemp.substring(leftIndex+1, rightIndex));//调用无括号计算器
bfTemp=bfTemp.replace(leftIndex, rightIndex+1,strTemp);//将算出来的结果替换相应部分
}
str=caculator(bfTemp.toString());//计算非括号的内容
System.out.println(str);
}catch(Exception e){
System.out.println("您的输入非法!");
}
}
/**
* 无法识别括号的计算器
* @param str 字符串表达式
*/
public static String caculator(String str){
str=prior(str,"\\^");//计算次方
str=prior(str,"[*|/]");//计算乘除
str=prior(str,"[+|\\-]");//计算加减
return str;
}
/**
* 处理算术运算
* @param str 表达式字符串
* @param sign 所要计算的运算符
* @return
*/
public static String prior(String str,String sign){
int result=0;
String singleSign=null;//取出运算符号
int a,b;
int count=str.length()-str.replaceAll(sign, "").length();//记录有多少个次方号
Pattern p=Pattern.compile("\\d*["+sign+"]\\d*");
Matcher m=null;
for(int i=1;i<=count;i++){
m=p.matcher(str);
//寻找最左边的运算式
if(m.find()){
singleSign=m.group().replaceAll("\\d*","");
a=Integer.parseInt(m.group().split("[+|\\-|*|/|\\^]")[0]);
b=Integer.parseInt(m.group().split("[+|\\-|*|/|\\^]")[1]);
switch (singleSign){
case "+":
result=a+b;
break;
case "-":
result=a-b;
break;
case "/":
result=a/b;
break;
case "*":
result=a*b;
break;
case "^":
result=(int)Math.pow(a, b);
break;
}
}
str=str.replaceFirst("\\d*["+sign+"]\\d*", result+"");//将计算好的结果替换该部分运算式
}
return str;
}
}