给定一个只包含0-9、‘+’、‘*’的合法数学表达式(长度<1000),规定加号‘+’的优先级高于乘号‘*’,请输出计算结果。 输入说明: 合法的数学表达式 输出说明: 输出表达式的计算结果 输入样例: 12*3+12*2 输出样例: 360用Java表示
时间: 2024-12-11 19:35:19 浏览: 4
为了计算给定的数学表达式,我们可以使用中缀表达式转换成后缀表达式(逆波兰表示法),然后再递归地进行求值。这种方法可以避免手动处理运算符的优先级问题。以下是Java的一个简单实现:
```java
import java.util.Stack;
public class Solution {
public int calculate(String s) {
char[] tokens = s.toCharArray();
Stack<Integer> numbers = new Stack<>();
Stack<Character> ops = new Stack<>();
for (char token : tokens) {
if (Character.isDigit(token)) { // 如果是数字,直接入栈
numbers.push(token - '0');
} else if (token == '+' || token == '*') { // 如果是运算符,先出栈直到遇到比它优先级低的运算符
while (!ops.isEmpty() && (ops.peek() == '*' || (ops.peek() == '+' && token != '+'))) {
numbers.push(calculateOp());
}
ops.push(token);
} else if (token == '(') { // 遇到左括号,直接入栈
ops.push(token);
} else if (token == ')') { // 遇到右括号,弹出并计算直至左括号
while (!ops.isEmpty() && ops.pop() != '(') {
numbers.push(calculateOp());
}
}
}
// 最后将剩余的运算符也计算出来
while (!ops.isEmpty()) {
numbers.push(calculateOp());
}
return numbers.pop(); // 返回最终结果
}
private int calculateOp() {
int num2 = numbers.pop();
int num1 = numbers.pop();
char op = ops.pop();
switch (op) {
case '+':
return num1 + num2;
case '*':
return num1 * num2;
default:
throw new IllegalArgumentException("Invalid operation");
}
}
}
```
输入样例:`calculate("12*3+12*2")` 的输出样例会是 `360`。
阅读全文