最近做一个项目需要做表达式的解析,初想不难,仔细研究之后,发现做细点可能会涉及到编译原理的词法解析和语法解析。但是如果只做简单的表达式计算,可以使用逆波兰式。
何为逆波兰式,可以看这个链接:https://baike.baidu.com/item/%E9%80%86%E6%B3%A2%E5%85%B0%E5%BC%8F/128437?fr=aladdin
简单研究了一下,下面是实现的简单四则运算:
public class RPNUtils {
private static final Logger logger = LoggerFactory.getLogger(RPNUtils.class);
/**
* 运算符优先级map(数字越大,优先级越高)
*/
static Map<String,Integer> priorityMap = new HashMap<>(4);
static{
priorityMap.put("+",1);
priorityMap.put("-",1);
priorityMap.put("*",2);
priorityMap.put("/",2);
priorityMap.put("(",0);
}
/**
* 计算表达式
* @param exp(中缀表达式)
* @return 计算结果
*/
public static Double calExp(String exp){
try{
logger.info("传入计算表达式:{}", exp);
List<String> rpnList = transToRPN(exp);
logger.info("逆波兰式为: