如何告诉 Java 操作数的顺序?
嗯,我对编码还很陌生,我的一个正在上高等类(class)的 friend 被要求制作一个计算器,我对它如何工作很感兴趣。
我搜索了它,我找到的解决方案几乎只是一个 super 基本的计算器,是我可以自己做的代码(我很欣赏这一点,因为还有很多我还不明白);但我正在寻找更复杂的东西。
这些建议是这样的:
Double result = 0;
System.out.println ("First opperand:");
Num1 = scan.next double();
System.out.println ("Choose operation (+,-,*,/):");
Ope = scan.next();
System.out.println ("Second opperand:");
Num2 = scan.next double();
Switch (ope) {
Case '+':
Result = num1 + num2;
break;
Case '-':
Result = num1 - num2;
break;
//and so on for each different operand that you want to add
}
System.out.println (result);
问题是,我猜计算器的想法是用户以字符串形式输入操作,然后计算器解释操作数和运算符。我想你可以使用 string 类来稍微简单地做到这一点,告诉它在整个字符串中搜索连续的数字作为要创建的新操作数变量以及其他任何内容作为运算符并检查它们是否有效(真的不知道如何正确地编程,因为我对此仍然很陌生,正如我之前所说的那样)。
但实际的问题是,我如何告诉程序“20/((10+5)*2)”之类的操作顺序?
我想我可以处理基本运算符,但如何处理括号?
我不知道这是否更先进,我什至不明白答案,或者它实际上有点简单,我只需要一些观点,但我对此真的很感兴趣,这就是我问的原因
最佳答案
您正在寻找的是一个合适的解析器,它将您的字符串转换为所谓的解析树>,以便您可以执行解析树描述的操作。
因此,数字表达式的解析器会将字符串“20/((10+5)*2)”转换为以下解析树:
[/]
/ \
20 [*]
/ \
[+] 2
/ \
10 5
然后您将在解析树上递归地执行计算,如下所示:
- 计算当前节点的值:
- 如果该节点是叶节点(数字),则:
- 使用数字的值作为节点的值。
- 如果该节点是非叶节点(具有子节点的操作数),则:
- 计算左子节点的值(递归)
- 计算右子节点的值(递归)
- 对两个计算值执行操作数指示的计算。
- 将计算结果作为节点的值。
- 如果该节点是叶节点(数字),则:
解析器是信息科学(也称为“计算机科学”)的一个完整子主题,因此它们无法在 stackoverflow 答案中真正得到解释,但至少你现在有了一个可以用来搜索的名称如果您愿意,可以获取更多信息。
关于Java计算器(运算顺序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75080666/