Как рассчитать выражение в Java? - PullRequest
1 голос
/ 25 августа 2011

Как рассчитать заданное пользователем выражение в java.

E: g, если заданный опыт равен 3 * 4 + (5 * 6), как рассчитать это.кто-нибудь может мне помочь.

Ответы [ 4 ]

4 голосов
/ 25 августа 2011

Я нашел этот код после быстрого Google:

import java.util.Stack;

/**
 * Class to evaluate infix and postfix expressions.
 * 
 * @author Paul E. Davis (feedback@willcode4beer.com)
 */
public class InfixPostfixEvaluator {

        /**
         * Operators in reverse order of precedence.
         */
        private static final String operators = "-+/*";
        private static final String operands = "0123456789";

        public int evalInfix(String infix) {
                return evaluatePostfix(convert2Postfix(infix));
        }

        public String convert2Postfix(String infixExpr) {
                char[] chars = infixExpr.toCharArray();
                Stack<Character> stack = new Stack<Character>();
                StringBuilder out = new StringBuilder(infixExpr.length());

                for (char c : chars) {
                        if (isOperator(c)) {
                                while (!stack.isEmpty() && stack.peek() != '(') {
                                        if (operatorGreaterOrEqual(stack.peek(), c)) {
                                                out.append(stack.pop());
                                        } else {
                                                break;
                                        }
                                }
                                stack.push(c);
                        } else if (c == '(') {
                                stack.push(c);
                        } else if (c == ')') {
                                while (!stack.isEmpty() && stack.peek() != '(') {
                                        out.append(stack.pop());
                                }
                                if (!stack.isEmpty()) {
                                        stack.pop();
                                }
                        } else if (isOperand(c)) {
                                out.append(c);
                        }
                }
                while (!stack.empty()) {
                        out.append(stack.pop());
                }
                return out.toString();
        }

        public int evaluatePostfix(String postfixExpr) {
                char[] chars = postfixExpr.toCharArray();
                Stack<Integer> stack = new Stack<Integer>();
                for (char c : chars) {
                        if (isOperand(c)) {
                                stack.push(c - '0'); // convert char to int val
                        } else if (isOperator(c)) {
                                int op1 = stack.pop();
                                int op2 = stack.pop();
                                int result;
                                switch (c) {
                                case '*':
                                        result = op1 * op2;
                                        stack.push(result);
                                        break;
                                case '/':
                                        result = op2 / op1;
                                        stack.push(result);
                                        break;
                                case '+':
                                        result = op1 + op2;
                                        stack.push(result);
                                        break;
                                case '-':
                                        result = op2 - op1;
                                        stack.push(result);
                                        break;
                                }
                        }
                }
                return stack.pop();
        }
        private int getPrecedence(char operator) {
                int ret = 0;
                if (operator == '-' || operator == '+') {
                        ret = 1;
                } else if (operator == '*' || operator == '/') {
                        ret = 2;
                }
                return ret;
        }
        private boolean operatorGreaterOrEqual(char op1, char op2) {
                return getPrecedence(op1) >= getPrecedence(op2);
        }

        private boolean isOperator(char val) {
                return operators.indexOf(val) >= 0;
        }

        private boolean isOperand(char val) {
                return operands.indexOf(val) >= 0;
        }

}

От: http://willcode4beer.com/design.jsp?set=evalInfix

2 голосов
/ 25 августа 2011

Java уже делает это. Не нужно ничего скачивать.

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class EvaluationExample {
    public static void main(String[] args) throws Exception{
        System.out.println(new ScriptEngineManager().getEngineByName("JavaScript").eval("3*4+(5*6)"));
    } 
}

(Это не первый SO-ответ, показывающий, как использовать сценарии в Java. Я добавил его только в том случае, если люди, просматривающие эту страницу, не переходят по ссылкам. Разбор - это весело и полезно для изучения, но если вы просто нужно оценить предоставленные пользователем выражения, используйте скрипт.)

ОБНОВЛЕНИЕ ОП ищет решение для оценки с постфиксом. Это должно быть сделано в два этапа: сначала преобразовать входную строку в постфиксную нотацию, а затем пропустить постфиксный «код» через (предположительно, основанный на стеке оценщик). Смотрите ответ PaulPRO для этого. Если вы хотите использовать JavaCC или другой генератор синтаксического анализатора, вы можете быть гораздо более гибкими с принимаемыми строками, допуская переводы строки и другие пробелы.

2 голосов
/ 25 августа 2011

Посмотрите на оценщик Java Expression: http://java.net/projects/eval/pages/Home

0 голосов
/ 25 августа 2011

Вот спойлер (синтаксический анализ математических выражений в Java).

...