从Stringvalidation多项式

我正在尝试创建一个多项式运算符(两个或多个多项式的和,休,乘和除)。 代码必须是Java并使用链接列表。

我想知道如何计算器或如何validation多项式是否有效。 我想从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)。 但这将是漫长的,也许还有更好的方法。

一般来说,这是使用解析器解决的 – 有许多库允许这样做,看看这里 。 由于这不是一个复杂的解析问题并且是一个家庭作业,你可能会手工编写 – 为此, 递归下降解析器 (也称为自顶向下解析器)是最简单的。 另请参阅类似的StackOverflow问题 。

你提到的 – 按字符分割,在这种情况下会很好用。 一般来说,您想要在优先权方面进行思考。 首先评估^,然后是*和/,然后是+和 – 。 递归下降解析器自上而下工作,所以你首先划分为最后评估的东西 – 也就是说,除以+和 – ,然后是*和/,最后是^。

在您的示例中,您从以下开始:

 10x^2 - 7x + 9 

所以你首先通过拆分+和 – 来获得三个节点:

 T1 = 10x^2 T2 = -7x T3 = +9 

这为您提供了+/- n * x ^ kforms的多项式项:

  10x^2 = +10 * x ^ 2 -7x = -7 * x ^ 1 +9 = +9 * x ^ 0 

因此,对于上述每一个你:

  • 在字符串的开头查看它是+还是 –
  • 查看术语中是否有“x”
    • 如果不是,那么你有x ^ 0的情况,所以你只有一个数字
    • 如果是,那么你看看是否有^
      • 如果不是,那么它是x ^ 1的情况
      • 如果是,那么它是x ^ k的情况

你提到了validation。 即你想丢弃无效输入,例如:

 1 + 2x^ -- 1 + 4^ x^2^3 + x 

更多工作,您可以使用正则表达式和他们的Java实现来完成这项工作。 如果你使用如上所述的自上而下的解析器,你可以在每个级别上执行此操作。 就像是:

  • 通过按+和 – 拆分将表达式拆分为术语
  • 检查每个术语是否为以下forms:+/-(n,nx或nx ^ k)

    • 你可以使用这样的正则表达式(注意 – 我没有测试它):

      “(\\ +?| – )([1-9] [0-9] )?(x(\ ^ [1-9] [0-9] )?)?”

    基本上说:

    • 可选加号或减号:(\\ +?| – ),
    • 也许是一组以非零数字开头的数字:([1-9] [0-9] *)?
    • 也许x 🙁 x …)?,
    • 也许^数字:(\\ ^ [1-9] [0-9] *)?

      如果您从未使用它们,请查看上述文档。 注意“\\”在Java字符串中用于转义“\”字符。

使用正则表达式组,您甚至可以轻松捕获各个部分。 您可以使用此类正则表达式测试程序来帮助您。

一个好主意是在处理之前删除空格 – 事实上,这可能是必要的。 请注意,如果您需要处理负系数和/或括号,这会比上面更复杂,倾向于真正的解析器。

希望这可以帮助。