我正在用Java构建一个基本的计算器,并有一些要求需要满足。它采用了用户示例中的数学表达式输入。3*5^5(必须用空格分隔(。我很难弄清楚如何将基本的数学表达式输入字符串math传递给isNumber函数,然后在该函数中检查字符串的第一个[0]点和之后的第四个点(因为空格还在吗?(是否有双精度。如果我把数学变成一个字符串数组,我可以做到,但需求特别指出,在之后我才能把字符串数学变成数组。我知道如果我能弄清楚这一点,那么制作一个运算符验证函数并对输入点执行同样的操作应该不难。。。这是我目前在这个项目上的进展。
import java.util.Scanner;
/**
*
* @author
*/
public class Calculator2 {
static ArrayList<String> validOperators = new ArrayList<String>(){{
add("^");
add("*");
add("/");
add("+");
add("-");
}};
public static void main(String[] args) {
System.out.println("This is a text based calculator!");
Scanner in = new Scanner(System.in);
boolean loop = true;
while (loop) {
System.out.println("Enter a math expression ot type quit to exit: ");
String math = in.nextLine();
if ("quit".equalsIgnoreCase(math)) {
System.out.print("Quitting");
break;
}
if (isOperator(math)){
if (isNumber(math)){
String[] splitExpression = math.split("\s+");
if(isValidExpression(splitExpression)){
for (int i=0; i<splitExpression.length; i++){
System.out.println(splitExpression[i]);
}
System.out.println("Number of tokens: " + splitExpression.length);
}
}else {
System.out.println("invalid expression!");
}
}else{
System.out.println("please use valid operators");
}
}
}
public static boolean isNumber(String number){
return
}
} ```
数字可以是可变长度的,可以有多个空格-你的方法(包括"检查第四个字符"(不起作用-你不能在这样的绝对位置上工作。它必须是相对的。
通常的方法是意识到你在这里构建了一个实际的语法,它可能会变得非常复杂(加上写括号的能力,它确实非常复杂(。看起来很简单,但事实并非如此。
一般来说,您首先对字符流进行标记,将其转换为节点流。CCD_ 1是一个节点。1.21398123
也是如此。节点知道它们代表什么样的东西。
然后,将节点流转化为一棵树。然后你通过穿过树,从叶子一直到根部来计算结果。
i、 e,这个:
"10 * (2+3)"
首先变成:
List.of(
NumericNode.of(10),
Operator.MULTIPLY,
Operator.OPEN_PAREN,
NumericNode.of(2),
Operator.ADD,
NumericNode.of(3),
Operator.CLOSE_PAREN);
然后变成:
*
/
10 +
/
2 3
然后,您可以通过递归地折叠节点,将其简单地"解析"为50。
一旦你把它分解成这样,你可能就会知道:不是微不足道的。
你可以在网上搜索标记器和解析器技术来了解如何完成这项工作。这需要一些阅读。