当前位置: 首页 > 面试题库 >

从字符串验证多项式

晏志明
2023-03-14
问题内容

我试图做一个多项式运算符(两个,多个多项式的和,余数,乘法和除法)。该代码必须使用Java并使用链接列表。

我想知道如何使用计算器或如何验证多项式是否有效。我想从字符串构造一个多项式,但是我不知道是否有另一个类可以简化事情。

这是一项家庭作业,因此我并不需要完整的代码,只是为我指明了正确的方向。

有两类,一类用于节点(命名为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)。但这会很长,也许还有更好的方法。


问题答案:

通常,可以使用解析器解决此问题-
有许多库允许执行此操作,请在此处查看。由于这不是一个复杂的解析问题,而是一项家庭作业,因此您可能需要手工编写所有内容-
为此,递归下降解析器(也称为自顶向下解析器)是最简单的。还可以看看类似的问题](http://codingdict.com/questions/93835)。

您提到的内容-
按字符拆分,在这种情况下效果很好。通常,您需要考虑优先级。首先评估^,然后评估和/,再评估+和-。递归下降解析器自上而下工作,因此您首先划分为最后求值的事物-即,在+和-上划分,然后在和/上划分,最后在^上划分。

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

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

因此,对于以上每种情况,您:

  • 看看字符串的开头是+还是-
  • 看看术语中是否有“ x”
    • 如果否,那么您有x ^ 0的情况,所以您只有一个数字
    • 如果是,那么您看是否有^
    • 如果否,则为x ^ 1种情况
    • 如果是,则为x ^ k

您提到了验证。也就是说,您要舍弃无效输入,例如:

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

要做更多的工作,您可以为此使用正则表达式及其Java实现。如果您如上所述使用自上而下的解析器,则将在每个级别上执行此操作。就像是:

  • 通过用+和-拆分将表达式拆分为项
  • 检查每个术语的形式是否为:+/-(n,nx或nx ^ k)

    • 您可以使用这样的正则表达式(注意-我没有测试过):

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

基本上说:

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

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

使用正则表达式组,您甚至可以轻松捕获各个部分。您可以使用像这样的正则表达式测试器来帮助您。

一个好主意是在处理之前删除空间-实际上,这可能是必要的。请注意,如果您需要处理负系数和/或括号,则这将比上面的复杂一些,倾向于使用真正的解析器。

希望这可以帮助。



 类似资料:
  • 我正在苦于一个程序,它让用户在两种颜色之间进行选择,要么输入全色(不区分大小写),要么输入颜色的第一个字母(不区分大小写),这取决于他们输入的颜色,它会自动将另一个分配给不同的变量。我的两个选项是蓝色和绿色,蓝色似乎工作良好,但当我输入绿色或g时,方法不断要求我输入一个新的输入。这里是我的程序的一个片段,处理颜色分配。 我基本上是创建一个while循环,确保用户选择其中一个颜色选项,并创建一个方法

  • @target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})@retention(value=runtime)@documented@constraint(validatedby={})public@interface Min 带注释的元素必须是一个数值,该数值必须大于或等于指定的最小值。 支持的类型有: 注意,由于舍入错误

  • 我有一个电子邮件地址字段,其中有一个客户端验证,不允许几个临时域,如tempmailder.com或dispostable.com. 在服务器端,我使用了fluent验证来指定验证规则。 web中不允许的临时域。将文件配置为逗号分隔的字符串。 我是否可以指定一种方法来验证用户根据不允许的电子邮件域列表输入的值。 谢啦

  • 问题内容: 我很难找到最简单的方法来针对给定的JSON模式字符串验证JSON字符串(作为参考,这是在Java中运行在Android应用程序中)。 理想情况下,我只想传入JSON字符串和JSON模式字符串,并且它返回关于是否通过验证的布尔值。通过搜索,我发现了以下两个有前途的库可以完成此任务: http://jsontools.berlios.de/ https://github.com/fge/j

  • 主要内容:JSF验证字符串长度实例标签用于验证字符串值的长度。我们可以使用标签,如下所示。 JSF验证字符串长度实例 打开 NetBeans IDE 创建一个Web工程:ValidateStringLength,其目录结构如下所示 - 创建以下文件代码,文件:index.xhtml 的代码内容如下所示 - 文件:result.xhtml 的代码内容如下所示 - 文件:User.java 的代码内容如下所示 - 右键运行工程:Val

  • 问题内容: 跟进正则表达式以匹配主机名或IP地址? 并使用对有效主机名的限制作为参考,在Python中匹配/验证主机名/ fqdn(完全限定域名)的最易读,简洁的方法是什么?我在下面的尝试中已经回答过,欢迎改进。 问题答案: import re def is_valid_hostname(hostname): if len(hostname) > 255: return False if host