java写一个中缀表达式,要能够处理小数点和负数,输入-15+1,得到结果-14
时间: 2023-05-24 08:04:18 浏览: 88
我们可以使用栈来实现中缀表达式求值。具体步骤如下:
1. 将中缀表达式转成后缀表达式。
2. 从左到右扫描后缀表达式,如果遇到数字,则将其入栈;如果遇到操作符,则从栈中弹出两个元素,进行相应的运算,并将结果入栈。
3. 最终栈中剩下的元素即为结果。
根据上述步骤,我们可以写出如下的代码:
```java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] tokens = sc.nextLine().split(" ");
double result = evaluate(tokens);
System.out.println(result);
}
private static double evaluate(String[] tokens) {
Stack<Double> stack = new Stack<>();
for (String token : tokens) {
if (isNumber(token)) {
stack.push(Double.parseDouble(token));
} else {
double b = stack.pop();
double a = stack.pop();
if (token.equals("+")) {
stack.push(a + b);
} else if (token.equals("-")) {
stack.push(a - b);
} else if (token.equals("*")) {
stack.push(a * b);
} else if (token.equals("/")) {
stack.push(a / b);
}
}
}
return stack.pop();
}
private static boolean isNumber(String s) {
try {
Double.parseDouble(s);
} catch (NumberFormatException e) {
return false;
}
return true;
}
}
```
在主函数中,我们先从输入中读取中缀表达式,并将其拆分成数组。然后调用 `evaluate` 函数求值,并将结果打印出来。
在 `evaluate` 函数中,我们创建一个栈 `stack`,用于存储数字或中间结果。然后遍历后缀表达式中的每个操作符或数字。
如果是数字,则将其转成 Double 类型,并入栈。
如果是操作符,则从栈中弹出两个数字,进行相应的运算,并将结果入栈。
遍历完后缀表达式后,栈中剩下的就是最终的结果。
在 `isNumber` 函数中,我们使用了 Java 中的异常机制。如果字符串不能转成 Double 类型,则会抛出 NumberFormatException 异常,我们在 catch 块中捕获该异常,并返回 false。
使用该程序进行测试,输入 `-15 1`,得到结果 `-14.0`,符合预期。