Java 验证后缀表达式而不进行计算

Java 验证后缀表达式而不进行计算,java,postfix-mta,Java,Postfix Mta,我试图设计一个程序,只检查给定的表达式是否是有效的后缀表达式。我不希望在任何时候将表达式作为过程的一部分进行计算 我检查的每一种方法都涉及到在堆叠数字之后以及遇到运算符时计算表达式。这对我来说不是必要的 我不知道如何在没有评估的情况下执行此操作像这样使用正则表达式 "Somestring with postfix -text".matches("-test$"); 你不能说什么样的表达是有效的。提供适当的解决方案需要知道将使用哪些函数(基本上是它们具有什么算术性以及它们返回到堆栈的参数数量)

我试图设计一个程序,只检查给定的表达式是否是有效的后缀表达式。我不希望在任何时候将表达式作为过程的一部分进行计算

我检查的每一种方法都涉及到在堆叠数字之后以及遇到运算符时计算表达式。这对我来说不是必要的

我不知道如何在没有评估的情况下执行此操作

像这样使用正则表达式

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

你不能说什么样的表达是有效的。提供适当的解决方案需要知道将使用哪些函数(基本上是它们具有什么算术性以及它们返回到堆栈的参数数量)

然而,假设一个简单计算器的“通常”情况,这可以通过线性运行输入标记来完成。您只需要计算堆栈中参数的数量。如果我们知道函数的算术性(参数的数量)和返回堆栈的结果的数量,就没有必要对函数求值

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 ");
    }
}

我不确定我是否完全理解,也许你可以用一个例子进一步说明。但是我会使用Java正则表达式,我正在寻找一个简单的逻辑/算法。每种检查表达式是否为有效后缀表达式的方法都涉及某种计算。我不想那样做。输出应该只是一个布尔值(比如对于有效的后缀表达式,该方法返回true)。只需使用普通的后缀计算算法并删除计算,但保留push和pops。如果堆栈上没有一个元素,则该元素无效,。或者只是使用普通的算法,把结果扔掉。后缀的意思是“反向波兰符号”(不是字符串中要替换的单词)。是的,他这样做了。他说他想验证后缀表达式。他没有说任何关于函数的事。
'3 4 + *' is not valid
'3 neg 2 + 5 * neg 4 +' is valid