Java实现简单的数学表达式计算

public class T {
    public static void main(String[] args) {
        long calculate = calculate("12+2312*(623+23*61*(6))");
        System.out.println(calculate);
    }


    public static long calculate(String express) {
        Queue<Integer> queue = new LinkedList<>();
        Stack<Integer> numStack = new Stack<>();
        Stack<Character> operateStack = new Stack<>();
        operateStack.push('#');
        int num1, num2;
        char[] chars = express.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (isDigits(chars[i])) {
                queue.offer(chars[i] - '0');
                int j = i + 1;
                for (; isDigits(chars[j]); j++) {
                    queue.offer(chars[j] - '0');
                }
                i = j - 1;
                numStack.push(toNumber(queue));
            } else if (isOperate(chars[i])) {
                if (comparePriority(operateStack.peek(), chars[i])) {
                    i--;
                    Character operate = operateStack.pop();
                    if (numStack.size() < 2) {
                        throw new IllegalArgumentException();
                    }
                    num1 = numStack.pop();
                    num2 = numStack.pop();
                    numStack.push(calculate(num1, num2, operate));
                } else {
                    operateStack.push(chars[i]);
                }
            } else if (chars[i] == '(') {
                operateStack.push(chars[i]);
            } else if (chars[i] == ')') {
                Character operate = operateStack.pop();
                while (operate != '(') {
                    num1 = numStack.pop();
                    num2 = numStack.pop();
                    numStack.push(calculate(num1, num2, operate));
                    operate = operateStack.pop();
                }
            } else {
                throw new IllegalArgumentException();
            }
        }
        Character operate = operateStack.pop();
        while (operate != '#') {
            num1 = numStack.pop();
            num2 = numStack.pop();
            numStack.push(calculate(num1, num2, operate));
            operate = operateStack.pop();
        }
        return numStack.pop();
    }

    private static int calculate(int a, int b, char operate) {
        switch (operate) {
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                return a / b;
            default:
                throw new IllegalArgumentException();
        }
    }

    private static boolean isDigits(char c) {
        return c >= '0' && c <= '9';
    }

    private static boolean isOperate(char c) {
        return c == '+' || c == '-' || c == '/' || c == '*' || c == '#';
    }

    private static boolean comparePriority(char one, char two) {
        if ((one == '*' || one == '/')
                && (two == '+' || two == '-')) {
            return true;
        }
        return (one == '+' || one == '-') && two == '#';
    }

    private static int toNumber(Queue<Integer> queue) {
        int res = 0;
        for (; !queue.isEmpty(); ) {
            res = res * 10 + queue.poll();
        }
        return res;
    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以通过以下几种方式计算数学表达式: 1. 使用eval()函数 Java中可以使用eval()函数来计算一个字符串表达式,该函数需要引入ScriptEngineManager和ScriptEngine两个类,代码如下: ```java import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; public class Main { public static void main(String[] args) throws Exception { ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); String mathExpr = "3+4*2"; System.out.println(engine.eval(mathExpr)); } } ``` 输出结果为11。 2. 使用第三方库 Java中也有一些第三方库可以用于计算数学表达式,比如JEP和Javaluator。 JEP是一个用于解析、评估和简化数学表达式Java库,可以实现高精度计算和符号计算。代码示例: ```java import com.singularsys.jep.*; import com.singularsys.jep.functions.*; import com.singularsys.jep.parser.*; import com.singularsys.jep.standard.*; import com.singularsys.jep.walkers.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { Jep jep = new Jep(); jep.addStandardFunctions(); jep.addStandardConstants(); String mathExpr = "3+4*2"; Node node = jep.parse(mathExpr); Object result = jep.evaluate(node); System.out.println(result); } } ``` 输出结果为11。 Javaluator是另一个用于解析和计算数学表达式Java库,支持变量、函数、自定义操作符等。代码示例: ```java import com.fathzer.soft.javaluator.*; public class Main { public static void main(String[] args) throws Exception { ExpressionEvaluator evaluator = new ExpressionEvaluator(); String mathExpr = "3+4*2"; Double result = evaluator.evaluate(mathExpr); System.out.println(result); } } ``` 输出结果为11.0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值