我正在尝试创建一个多项式运算符(两个或多个多项式的和,休,乘和除)。代码必须是Java并使用链接列表。
我想知道如何计算器或如何验证多项式是否有效。我想从String构造一个多项式,但我不知道是否还有另一个类可以缓解事物。
这是一项家庭作业,所以我不是要求完整的代码,只是指向我的方向。
有两个类,一个用于节点(名为Monomio),另一个用于列表(名为Polinomio,是单项式的总和)。
节点类Monomio siguienteMonomio; // The next monomial
int exponente; // I don't know how to say this in English, maybe power
int coeficiente; // The coefficient
// A bunch of methods, to sum, multiply etc.
并且列表类有
Monomio primerMonomio; //First Monomial
Monomio ultimoMonomio; //Last Monomial
// A bunch of methods, like organize the polynomial by the power, multiply, sum, etc.
现在我需要一个像这样的构造函数。
public Polinomio(String polinomio){
enter code here
}
用户应输入以下内容:
10x ^ 2 - 7x + 9
因此构造函数列出了三个节点:
//First node
int coeficiente = 10;
int exponente = 2;
Monomio siguienteMonomio = //secondNode
//Second node
int coeficiente = -7;
int exponente = 1;
Monomio siguienteMonomio = //thirdNode
//Third node
int coeficiente = 9;
int exponente = 0;
Monomio siguienteMonomio = null;
那么,关于如何制作这个的任何想法?我可以简单地跟踪特定字符(+ - ^ x)。但这将是漫长的,也许还有更好的方法。
答案 0 :(得分:4)
通常,这是使用parsers解决的 - 有许多库允许这样做,看看here。由于这不是一个复杂的解析问题而且是一个功课,你可能会手工编写 - 为此,recursive descent parsers(也称为自上而下的解析器)是最简单的。另请参阅类似的StackOverflow question。
你提到的 - 按字符分割,在这种情况下会很好用。一般来说,您想要在优先权方面进行思考。首先评估^,然后是*和/,然后是+和 - 。递归下降解析器自上而下工作,因此您首先划分为最后评估的事物 - 即,除以+和 - ,然后打开*和/,最后打开^。
在您的示例中,您从:
开始10x^2 - 7x + 9
所以你首先通过分割+和 - 来获得三个节点:
T1 = 10x^2
T2 = -7x
T3 = +9
这为您提供了+/- n * x ^ k形式的多项式项:
10x^2 = +10 * x ^ 2
-7x = -7 * x ^ 1
+9 = +9 * x ^ 0
因此,对于上述每一个人:
您提到了验证。即你想丢弃无效的输入,例如:
1 + 2x^
-- 1 + 4^
x^2^3 + x
还有一点工作,您可以使用regular expressions和他们的Java implementation来完成这项工作。如果你使用如上所述的自上而下的解析器,你可以在每个级别上执行此操作。类似的东西:
检查每个术语是否为以下形式:+/-(n,nx或nx ^ k)
你可以使用这样的正则表达式(注意 - 我没有测试它):
“?(\\ + | - ?)([1-9] [0-9]的)(ΔX(\ ^ [1-9] [0-9] )) ?“
基本上说:
也许^数字:(\\ ^ [1-9] [0-9] *)?
如果您从未使用它们,请查看上述文档。注意“\\”在Java字符串中用于转义“\”字符。
使用正则表达式组,您甚至可以轻松捕获各个部分。您可以使用this之类的正则表达式测试程序来帮助您。
一个好主意是在处理之前删除空格 - 事实上,这可能是必要的。请注意,如果您需要处理负系数和/或括号,这比上面的更复杂,倾向于真正的解析器。
希望这有帮助。