package com.aaront.exercise.basic.expr; import java.util.ArrayList; import java.util.List; public class PrefixExpr { String expr = null; public PrefixExpr(String expr) { this.expr = expr; } public float evaluate() { List<String> elements = toList(expr.split(" ")); for (int i = elements.size() - 1; i >= 0; i++) { String element = elements.get(i); if (element.equals("+") || element.equals("-") || element.equals("*") || element.equals("/")) { Double result = calc(element, Double.valueOf(elements.get(i + 1)), Double.valueOf(elements.get(i + 2))); elements.add(i, result.toString()); for (int j = 0; j < 3; j++) { elements.remove(i + 1); } i = elements.size() - 2; } } return Float.valueOf(elements.get(0)); } private List<String> toList(String[] elements) { List<String> list = new ArrayList<>(elements.length); for (int i = 0; i < elements.length; i++) { list.add(elements[i]); } return list; } private Double calc(String operator, Double operand1, Double operand2) { switch (operator) { case "+": return operand1 + operand2; case "-": return operand1 - operand2; case "*": return operand1 * operand2; case "/": return operand1 / operand2; default: throw new IllegalArgumentException("不支持的运算符"); } } }