我正在尝试找到类似Java Embedding Plugin(JEP)的东西,它可以评估数学公式(字符串)并给出答案。
但它也应该计算一个变量,例如:(25 + 36 + x)* 2 = 25应该给出:x = -11
有点像http://www.wolframalpha.com/,但它不应该是多功能的,它应该脱机工作。
首选开源。
我的小计算器项目http://sourceforge.net/projects/calex/需要它。
答案 0 :(得分:3)
这称为Arithmetic evaluation
。实现这一目标的最简单方法之一是使用Edsger Dijkstra Shunting-yard_algorithm。
分流码算法是一个 解析数学的方法 中缀表示法中指定的方程式。 它可以用来产生输出 反向波兰表示法(RPN)或作为 抽象语法树(AST)。该 算法是由Edsger发明的 Dijkstra并命名为“调车场” 算法因为它的操作 类似于铁路调车 码。就像评估RPN一样 调车场算法是 基于堆栈的。中缀表达式是 数学符号的形式最多 人们习惯了,例如3 + 4 或3 + 4 *(2-1)。对于那里的转换 是两个文本变量(字符串), 输入和输出。还有一个 尚未拥有运营商的堆栈 添加到输出队列。转换, 程序按顺序读取每个符号 并做了一些基于此的事情 符号
但是我已经在一些stackoverflow用户博客上看到了你正在寻找的确切解决方案,但我记不起地址(它就像'代码猴子')。它是轻量级的,你可以在applet中使用(你也可以定义常量和重置值)。
修改:找到它:http://tech.dolhub.com/Code/MathEval
线性递归数学评估器
这个数学表达式评估器的诞生是因为需要一个小型且有效的解决方案,可以合理有效地评估任意表达式而无需预编译。我需要一些可以用变量做基本数学的东西,例如:“Top + 2”,“Bottom-2”和“(Right + 1-Left)/ 2”。
互联网上的研究提出了许多相当不错的解决方案,所有解决方案都围绕创建解析树(这是有意义的)。问题是 - 它们都相当笨重,我不能为我的applet大小添加100K只是为了数学。所以我开始怀疑这个问题的线性递归解决方案。最终结果是一个可接受的单一类,没有外部依赖,权重低于10 KiB。
答案 1 :(得分:0)
我根据Dijkstra's Shunting Yard的条款发布了基于Apache License 2.0算法的表达式评估程序: