Java解析加减乘除表达式
导言
在计算机科学中,表达式通常用于表示数学算式或逻辑关系。在编程中,我们经常需要解析和计算这些表达式。本文将介绍如何使用Java解析和计算加减乘除表达式,并提供相应的代码示例。
表达式的基本概念
在数学中,加减乘除表达式是由数字、运算符(+、-、*、/)和括号组成的算式。在编程中,我们可以将表达式表示为字符串,然后使用算法解析和计算该表达式。
解析表达式
在Java中,我们可以使用递归下降法来解析表达式。递归下降法是一种基于规则的语法分析方法,它通过递归地调用各个规则来解析语法。
下面是一个简单的递归下降解析器的示例代码:
public class ExpressionParser {
private String input;
private int position;
public ExpressionParser(String input) {
this.input = input;
this.position = 0;
}
public double parse() {
return parseExpression();
}
private double parseExpression() {
double left = parseTerm();
while (position < input.length()) {
char operator = input.charAt(position++);
double right = parseTerm();
switch (operator) {
case '+':
left += right;
break;
case '-':
left -= right;
break;
default:
throw new IllegalArgumentException("Invalid operator");
}
}
return left;
}
private double parseTerm() {
double factor = parseFactor();
while (position < input.length()) {
char operator = input.charAt(position++);
double operand = parseFactor();
switch (operator) {
case '*':
factor *= operand;
break;
case '/':
factor /= operand;
break;
default:
throw new IllegalArgumentException("Invalid operator");
}
}
return factor;
}
private double parseFactor() {
if (position >= input.length()) {
throw new IllegalArgumentException("Invalid expression");
}
char ch = input.charAt(position++);
if (ch == '(') {
double result = parseExpression();
if (position >= input.length() || input.charAt(position++) != ')') {
throw new IllegalArgumentException("Invalid expression");
}
return result;
} else if (Character.isDigit(ch)) {
StringBuilder sb = new StringBuilder();
sb.append(ch);
while (position < input.length() && Character.isDigit(input.charAt(position))) {
sb.append(input.charAt(position++));
}
return Double.parseDouble(sb.toString());
} else {
throw new IllegalArgumentException("Invalid expression");
}
}
}
在上述代码中,我们使用了三个递归函数来解析表达式:parseExpression
、parseTerm
和parseFactor
。parseExpression
函数用于解析加减表达式,parseTerm
函数用于解析乘除表达式,parseFactor
函数用于解析括号、数字等因子。
代码示例
下面是一个使用上述解析器的示例代码:
public class Main {
public static void main(String[] args) {
String input = "(1 + 2) * (3 - 4) / 5";
ExpressionParser parser = new ExpressionParser(input);
double result = parser.parse();
System.out.println("Result: " + result);
}
}
在上述示例代码中,我们使用了一个简单的加减乘除表达式 (1 + 2) * (3 - 4) / 5
。我们创建了一个ExpressionParser
对象,并将表达式作为参数传递给它的构造函数。然后,我们调用parse
方法来解析和计算表达式,并将结果打印输出。
类图
下面是一个使用Mermaid语法表示的类图,展示了解析器的类结构和关系:
classDiagram
class ExpressionParser {
-String input
-int position
+ExpressionParser(input: String)
+parse(): double
-parseExpression(): double
-parseTerm(): double
-parseFactor(): double
}
在上述类图中,我们定义了一个ExpressionParser
类,它包含了解析和计算表达式的方法和属性。
结论
本文介绍了如何使用Java解析和计算加减乘除表达式。