Java 中计算字符串表达式的值

Java 中计算字符串表达式的值

在 Java 中计算字符串数值表达式可以用 javax.script.ScriptEngine#eval(java.lang.String),通过调用 JavaScript 来计算

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class ExpressionCalculate {
    public static void main(String[] args) {
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("nashorn");
        String expression = "10 * 2 + 6 / (3 - 1)";

        try {
            String result = String.valueOf(scriptEngine.eval(expression));
            System.out.println(result);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }
}

结果: 23

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是Java实现字符串达式的代码: ```java import java.util.Stack; public class ExpressionEvaluation { public static int evaluate(String expression) { Stack<Integer> operands = new Stack<>(); Stack<Character> operators = new Stack<>(); for (int i = 0; i < expression.length(); i++) { char c = expression.charAt(i); if (c == ' ') { continue; } else if (Character.isDigit(c)) { int num = 0; while (i < expression.length() && Character.isDigit(expression.charAt(i))) { num = num * 10 + (expression.charAt(i) - '0'); i++; } i--; operands.push(num); } else if (c == '(') { operators.push(c); } else if (c == ')') { while (operators.peek() != '(') { int result = applyOperator(operators.pop(), operands.pop(), operands.pop()); operands.push(result); } operators.pop(); } else { while (!operators.isEmpty() && precedence(c) <= precedence(operators.peek())) { int result = applyOperator(operators.pop(), operands.pop(), operands.pop()); operands.push(result); } operators.push(c); } } while (!operators.isEmpty()) { int result = applyOperator(operators.pop(), operands.pop(), operands.pop()); operands.push(result); } return operands.pop(); } private static int precedence(char operator) { if (operator == '+' || operator == '-') { return 1; } else if (operator == '*' || operator == '/') { return 2; } else { return 0; } } private static int applyOperator(char operator, int b, int a) { switch (operator) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': if (b == 0) { throw new ArithmeticException("Division by zero"); } return a / b; default: throw new IllegalArgumentException("Invalid operator: " + operator); } } } ``` 以上代码实现了一个静态方法evaluate,接收一个字符串达式作为参数,返回达式计算结果。在方法内部,我们使用两个栈,一个用于存储操作数,一个用于存储运算符。然后遍历达式的每个字符,如果是空格,则跳过,如果是数字,则将数字解析出来并压入操作数栈,如果是左括号,则将其压入运算符栈,如果是右括号,则不断弹出运算符栈的运算符,直到遇到左括号,同时将弹出的运算符和操作数进行计算,并将计算结果压入操作数栈。如果是运算符,则不断弹出运算符栈的运算符,直到栈顶运算符的优先级低于当前运算符的优先级,同时将弹出的运算符和操作数进行计算,并将计算结果压入操作数栈。最后,当达式遍历完成后,不断弹出运算符栈的运算符,同时将弹出的运算符和操作数进行计算,并将计算结果压入操作数栈,直到运算符栈为空。最后,操作数栈只剩一个元素,这个元素就是达式计算结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值