Java四则运算器的实现
作为一名经验丰富的开发者,我很高兴能够教会你如何实现一个Java四则运算器。下面是整个实现过程的流程表格。
步骤 | 描述 |
---|---|
1 | 获取用户输入的表达式 |
2 | 将表达式转换为逆波兰表达式 |
3 | 计算逆波兰表达式的结果 |
4 | 输出计算结果 |
接下来我将详细解释每个步骤需要做什么,并提供相应的代码示例和注释。
步骤1:获取用户输入的表达式
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入表达式:");
String expression = scanner.nextLine();
scanner.close();
// TODO: 将获取到的表达式传递给下一步处理
}
}
在这个步骤中,我们使用Scanner
类获取用户输入的表达式,并将其保存在expression
变量中。你可以根据实际需求对用户输入进行校验,确保输入的表达式是合法的。
步骤2:将表达式转换为逆波兰表达式
import java.util.Stack;
public class Main {
public static void main(String[] args) {
// ...
String postfixExpression = infixToPostfix(expression);
// ...
}
private static String infixToPostfix(String expression) {
StringBuilder postfix = new StringBuilder();
Stack<Character> stack = new Stack<>();
for (char c : expression.toCharArray()) {
if (Character.isDigit(c)) {
postfix.append(c);
} else if (c == '(') {
stack.push(c);
} else if (c == ')') {
while (!stack.isEmpty() && stack.peek() != '(') {
postfix.append(stack.pop());
}
stack.pop(); // 弹出左括号
} else {
while (!stack.isEmpty() && priority(c) <= priority(stack.peek())) {
postfix.append(stack.pop());
}
stack.push(c);
}
}
while (!stack.isEmpty()) {
postfix.append(stack.pop());
}
return postfix.toString();
}
private static int priority(char operator) {
if (operator == '+' || operator == '-') {
return 1;
} else if (operator == '*' || operator == '/') {
return 2;
} else {
return 0;
}
}
}
在这个步骤中,我们使用一个栈来辅助将中缀表达式转换为逆波兰表达式。对于输入的中缀表达式中的每个字符,我们按照运算符优先级的规则进行处理。具体实现中,我们使用StringBuilder
来构建逆波兰表达式,使用Stack
来保存运算符。
步骤3:计算逆波兰表达式的结果
import java.util.Stack;
public class Main {
public static void main(String[] args) {
// ...
int result = evaluatePostfix(postfixExpression);
// ...
}
private static int evaluatePostfix(String postfixExpression) {
Stack<Integer> stack = new Stack<>();
for (char c : postfixExpression.toCharArray()) {
if (Character.isDigit(c)) {
stack.push(Character.getNumericValue(c));
} else {
int operand2 = stack.pop();
int operand1 = stack.pop();
int result;
switch (c) {
case '+':
result = operand1 + operand2;
break;
case '-':
result = operand1 - operand2;
break;
case '*':
result = operand1 * operand2;
break;
case '/':
result = operand1 / operand2;
break;
default:
throw new IllegalArgumentException("Invalid operator: " + c);
}
stack.push(result);
}
}
return stack.pop();
}
}
在这个步骤中,我们利用栈来计算逆波兰表达式的结果。对于逆波兰表达式中的每个字符,如果是数字,则将其转换为整数并入栈;如果是运算符,则从栈中弹出两个操作数进行相应的运算,并将结果入栈。最终,栈中仅剩下一个元素,即