Java语言怎么用字符串的方式表示一个表达式,并且计算表达式的值是什么
【以下回答由 GPT 生成】
解决方案:
Java中可以使用以下步骤来表示一个字符串的数学表达式,并计算表达式的结果:
如果字符串遍历完毕,但栈中还有操作符,则将栈中的所有操作符出栈,并添加到结果列表中。
使用栈和RPN表达式计算结果。
下面是示例代码来实现上述步骤:
import java.util.*;
public class ExpressionCalculator {
public static int calculateExpression(String expression) {
List<String> rpn = convertToRPN(expression);
return calculateRPN(rpn);
}
private static List<String> convertToRPN(String expression) {
List<String> rpn = new ArrayList<>();
Stack<String> stack = new Stack<>();
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (Character.isDigit(c)) {
StringBuilder num = new StringBuilder();
num.append(c);
while (i + 1 < expression.length() && Character.isDigit(expression.charAt(i + 1))) {
num.append(expression.charAt(i + 1));
i++;
}
rpn.add(num.toString());
} else if (c == '+' || c == '-' || c == '*' || c == '/') {
while (!stack.isEmpty() && isHigherPriority(stack.peek(), Character.toString(c))) {
rpn.add(stack.pop());
}
stack.push(Character.toString(c));
} else if (c == '(') {
stack.push(Character.toString(c));
} else if (c == ')') {
while (!stack.isEmpty() && !stack.peek().equals("(")) {
rpn.add(stack.pop());
}
stack.pop();
}
}
while (!stack.isEmpty()) {
rpn.add(stack.pop());
}
return rpn;
}
private static boolean isHigherPriority(String operator1, String operator2) {
if (operator1.equals("*") || operator1.equals("/")) {
return true;
} else if (operator1.equals("+") || operator1.equals("-")) {
return !operator2.equals("*") && !operator2.equals("/");
}
return false;
}
private static int calculateRPN(List<String> rpn) {
Stack<Integer> stack = new Stack<>();
for (String token : rpn) {
if (Character.isDigit(token.charAt(0))) {
stack.push(Integer.parseInt(token));
} else {
int operand2 = stack.pop();
int operand1 = stack.pop();
int result = 0;
switch (token) {
case "+":
result = operand1 + operand2;
break;
case "-":
result = operand1 - operand2;
break;
case "*":
result = operand1 * operand2;
break;
case "/":
result = operand1 / operand2;
break;
}
stack.push(result);
}
}
return stack.pop();
}
public static void main(String[] args) {
String expression = "2 + 3 * 5 - 4";
int result = calculateExpression(expression);
System.out.println(result);
}
}
通过调用calculateExpression
方法,传入一个数学表达式的字符串,即可计算出表达式的结果。以上述字符串表达式为例,将输出结果为13。
我希望这个解决方案对你有帮助。如果你有任何疑问,请随时追问。
【相关推荐】
可以 采用 栈 这种数据结构 来做
如 “1+2*3”
一、构建后缀表达式
构建的过程及原理就是:构建一个操作符栈,和一个后缀式栈,如果是数字则直接入后缀式栈。如果是操作符,即入操作符栈,比较当前操作符与栈顶操作符的运算优先级,
若优先级低于当前栈顶元素。即把所有优先级不小于当前操作符的站内元素出栈并加入到后缀式栈。其中比较特殊的是‘(’和‘)’。左括弧的运算级别忽略,但同时也作为栈内元素出栈的分界点。即假如栈内为( + * ,现在的操作符为-时,仅将、+出栈,而(与*保留。直到遇到‘)’时将栈内直到‘(’的元素全部出栈。
二、将栈内元素翻转。依次加入到结果栈内,若为数字直接加入。遇到操作符即从结果栈内取出两个元素操作完后加入结果栈。最后即可得到结果。