java eval计算_JAVA中的eval , 能计算字符串的算数公式!

该博客展示了用Java实现算术表达式计算的代码。定义了操作、优先级判断等方法,通过栈结构处理运算符和操作数,还能处理括号嵌套情况,最后在main方法中给出示例进行计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class Arithmetic {

public Arithmetic() {

}

/*操作区*/

private double operation(double n1,double n2,String expression){

if(expression.equals("+")){

return n1 + n2;

} else if(expression.equals("-")){

return n1 - n2;

} else if(expression.equals("*")){

return n1 * n2;

} else if(expression.equals("/")){

return n1 / n2;

}

return 0;

}

/*优先级*/

private int priority(String expression){

if(expression.equals("+") || expression.equals("-")){

return 0;

} else if(expression.equals("*") || expression.equals("/")){

return 1;

} else {

return -1;

}

}

/**

* 判断是否为一个算数运算符

* @param expression 算式运算符

* @return

*/

private boolean isExpression(String expression){

return expression.equals("+") || expression.equals("-") || expression.equals("*") || expression.equals("/") ;

}

/**

* 计算入口

* @param numModel 算式

* @return 结果

*/

public double doAccount(String numModel){

int endIndex = 0;

int startIndex = numModel.indexOf("(",endIndex);

while(startIndex != -1){

endIndex = numModel.indexOf(")", startIndex) + 1;

String segment = numModel.substring(startIndex,endIndex);

double tResult = account(segment.replace("(","").replace(")",""));

numModel = numModel.replace(segment,String.valueOf(tResult));

startIndex = numModel.indexOf("(",0);

}

DecimalFormat format = new DecimalFormat("0.##");

return Double.parseDouble(format.format(account(numModel)));

}

/**

* 核心算法逻辑

* @param numModel  算式

* @return

*/

@SuppressWarnings("unchecked")

private double account(String numModel){

String operators [] = {"//+","//-","//*","///","//(","//)"};

for(String operator : operators){

numModel = numModel.replaceAll(operator," "+operator+" ");

}

Stack operStack = new Stack();

String numModels[] = numModel.split("//s+");

String preEle = "";

for(int i = 0; i < numModels.length; i++){

if(isExpression(numModels[i])){

if(preEle == null || preEle.equals("")){

preEle = numModels[i];

} else {

if(priority(preEle) >= priority(numModels[i])){

double d1 = Double.parseDouble(String.valueOf(operStack.pop()));

double d2 = Double.parseDouble(String.valueOf(operStack.pop()));

operStack.push(operation(d2,d1,preEle));

preEle = numModels[i];

} else if(priority(preEle) < priority(numModels[i])){

double d1 = Double.parseDouble(String.valueOf(operStack.pop()));

double d2 = Double.parseDouble(numModels[i+1]);

operStack.push(operation(d1,d2,numModels[i]));

i++;

}

}

} else {

operStack.push(numModels[i]);

}

}

double d1 = Double.parseDouble(String.valueOf(operStack.pop()));

double d2 = Double.parseDouble(String.valueOf(operStack.pop()));

return operation(d2,d1,preEle);

}

/**  * @param args  */ public static void main(String[] args) {  String numModel = "111.1 * (2 - 1) + (2 - 1) + 50 - 10 * (12 + 3)";  System.out.println(new Arithmetic().doAccount(numModel)); }}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值