四则运算表达式解析,分离分子和分母表达式(Java实现)

四则运算表达式解析,分离分子和分母表达式(Java实现)

背景需求

最近项目中遇到这样一个问题。在做指标归因分析的过程中,需要将一个指标运算的逻辑拆解出来,也就是将指标的分子表达式和分母表达式解析出来。比如这样一个指标: (xinzhuangxiu_mendiandaofang+xinzhuangxiu_mendianchenhui)/xinzhuangxiu_qiandaozongliang,需要将分子分母分别提取出来返回。

最终采用了栈+逆波兰 的处理方式。

Step1:将运算表达式字符串分解为运算表达式List

Step2:将运算表达式List转换为逆波兰表达式List

Step3:逆波兰表达式运算

最终可以实现分子分母表达式的解析,并支持中文指标名

执行代码

package com.ke.bigdata.aas.util;

import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
/**
 * 四则混合运算表达式解析
 * @author WeiZhaolin
 */
public class ExpParserUtil {
   
    /**
     * 运算符枚举
     */
    private enum Operator {
   
        ADD("+", 10), SUBTRACT("-", 10), MULTIPLY("*", 20), DIVIDE("/", 20),
        PARENTHESIS_LEFT("(", 100), PARENTHESIS_RIGHT(")", 100);
        private String operator;
        private int priority;
        private Operator(String operator, int priority) {
   
            this.operator = operator;
            this.priority = priority;
        }
    }


    /**
     * 获取字符串所对应的运算符枚举
     * @param str
     * @return
     */
    private static Operator getOperator(String str) {
   
        for (Operator op : Operator.values()) {
   
            if (str.equals(op.operator)) {
   
                return op;
            }
        }
        return null;
    }

    /**
     * 第1步: 将运算表达式字符串分解为运算表达式List
     *
     * @param exp
     * @return
     */
    private static List<String> resolveExpr(String exp) {
   
        List<String> list = new LinkedList<String>();
        String temp = "";
        exp = exp.replace(" ", "");
        for (int i = 0; i < exp.length(); i++) {
   
            String str = exp.substring(i, i + 1);
            Operator op = getOperator(str);
            // Operand od = getOperand(str);
            if (op != null) {
   
                if (!temp.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值