Проверьте выражение постфикса без оценки - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь разработать программу, которая просто проверяет, является ли данное выражение действительным постфиксным или нет. Я не хочу, чтобы это оценивало выражение как часть процесса в любой момент.

Каждый проверенный мною подход включает оценку выражения после суммирования чисел, а затем при обнаружении оператора. Мне это не нужно.

Я не знаю, как это сделать без оценки

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Вы не говорите, какие выражения допустимы. Для обеспечения адекватного решения необходимо знать, какие функции будут использоваться (в основном, какая у них арность и сколько аргументов они возвращают в стек).

Однако, если принять «обычный» случай простого калькулятора, это может бытьвыполняется путем линейного запуска входных токенов. Вам нужно только посчитать количество аргументов в стеке. Нет необходимости оценивать функции, если мы знаем их арность (количество аргументов) и количество результатов, которые возвращаются в стек.

final static Map<String, Integer> arity = new HashMap<String, Integer>() {{
    put("*", 2);
    put("/", 2);
    put("+", 2);
    put("-", 2);
    put("neg", 1);
    put("inv", 1);
    // etc...
}};

static boolean isConstant(String token) {
    return Pattern.matches("^[0-9]+$", token);
}

static boolean valid(String postfix) {
    int availableArguments = 0;
    for(final String token: postfix.split(" +")) {
        if(isConstant(token)) {
            availableArguments += 1;
        } else if(arity.containsKey(token)) {
            final int argumentsRequired = arity.get(token);
            if(argumentsRequired > availableArguments) {
                // argument required
                return false;
            } else {
                availableArguments -= argumentsRequired;
                // not all functions must stack only one result
                availableArguments += 1;
            }
        } else {
            // wrong token
            return false;
        }
    }
    // other values than 1 could be valid
    return availableArguments == 1;
}

public static void main(String... args) {
    for(final String expr: asList("3 4 + *", "3 neg 2 + 5 * neg 4 +")) {
        System.out.printf("'%s' is %svalid%n", expr, valid(expr) ? "": "not ");
    }
}

С выводом

'3 4 + *' is not valid
'3 neg 2 + 5 * neg 4 +' is valid
0 голосов
/ 22 октября 2019

Используйте регулярные выражения, как это

"Somestring with postfix -text".matches("-test$");
...