Java 调车场算法中变量辨识的实现
这是问题的后续行动。 此时,我希望程序自己识别变量,然后向用户询问变量值。因此,不要看起来像:Java 调车场算法中变量辨识的实现,java,expression,evaluate,shunting-yard,Java,Expression,Evaluate,Shunting Yard,这是问题的后续行动。 此时,我希望程序自己识别变量,然后向用户询问变量值。因此,不要看起来像: Enter an Expression: ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10)) Enter Variables: X1,X2,Y Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2
Enter an Expression:
ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))
Enter Variables: X1,X2,Y
Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2
The Result is: 1.94
该程序的功能如下:
Enter an Expression:
ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))
your variables are : X1,X2,Y
now Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2
The Result is: 1.94
因此,用户不再需要告诉机器变量是什么。
如何才能做到这一点
我已经检查了这个问题,但它和我需要的完全不同,而且它是用python编写的
更新:特别是我想迭代调车场算法,以便它可以找到变量。我在下面为解析器代码添加了一个链接
您应该存储所有函数的名称,然后查找所有既不是函数也不是数字的参数
因此,当您扫描输入
ADD(X,DIV(3,Y))
时,它应该检测到ADD
和DIV
是函数,3是数字。这就剩下了X和Y,它们必须是变量。基本上,无论何时检测到括号,都应该查找匹配的结束括号,然后在逗号处拆分这些括号的内容并计算每个部分。如果零件既不是数字也不是函数,则它必须是变量。我建议使用以下算法:
List<String> getVariables(String expression, List<String> functions) {
return Collections.list(new StringTokenizer(expression, "(),")).stream()
.map(Object::toString)
.filter(token -> !functions.contains(token))
.filter(token -> !token.matches("\-?\d+\.?\d*"))
.collect(Collectors.toList());
}
List getVariables(字符串表达式、列表函数){
返回Collections.list(新的StringTokenizer(表达式,“(),”)).stream()
.map(对象::toString)
.filter(令牌->!functions.contains(令牌))
.filter(标记->!标记.matches(“\-?\d+\。?\d*”)
.collect(Collectors.toList());
}
你需要编写一个解析器。当你为你的方程创建一个解析树时,你需要检查每个作为标识符的标记是否是已知的(例如函数名或已知常数,如π)。如果没有,请将其标记为变量。谢谢您的回答,顺便问一下,我如何将其实现到EvalEx的调车场算法,我正在使用该算法进行解析?这是密码