代码:
package com.wangyq.datastructrue.calculator;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.*;
class Test {
public static void main(String[] args) {
//要计算的公式
//认为公式为正确的不需要校验
String equation = "9+avg(3,1,sum(1,3)-sum(2,4),7)*3+8/2";//19
//定义公式解析器
//传入运算函数所在的类
Calculator calculator = new Calculator(Test.class);
//添加计算方法
//求和
calculator.addFunction("sum");
//求平均值
calculator.addFunction("avg");
//计算值
BigDecimal result = calculator.calculate(equation);
System.out.println(result);
}
Test() {
}
/**
* 求和
*
* @param stack
* @return
*/
public static BigDecimal sum(Stack stack) {
BigDecimal sum = new BigDecimal("0");
while (!stack.isEmpty()) {
sum = sum.add(new BigDecimal(stack.pop().toString()));
}
return sum;
}
/**
* 求平均值
*
* @param stack
* @return
*/
public static BigDecimal avg(Stack stack) {
BigDecimal sum = new BigDecimal("0");
int count = stack.size();
while (!stack.isEmpty()) {
sum = sum.add(new BigDecimal(stack.pop().toString()));
}
return sum.divide(new BigDecimal(count), 7, BigDecimal.ROUND_HALF_UP);
}
}
public class Calculator {
//存放方法
Set functionList = new HashSet();
//存放后序表达式
Queue queue = new ArrayDeque();
//含有计算方法的class
Class functionClass = null;
/**
* 添加方法
*/
public Calculator(Class functionClass) {
this.functionClass = functionClass;
}