返回
直面 227:算法挑战,破解基本计算器 II
前端
2023-12-25 23:24:56
揭秘算法竞赛中的「基本计算器 II」:掌握中缀表达式转后缀表达式和后缀表达式求值
踏入算法竞赛的殿堂,我们面临着各式各样的挑战。其中,「基本计算器 II」可谓一道难关,考验着我们的算法思维和逻辑推理能力。在这篇博文中,我们将深入探索这道算法难题,揭开它的神秘面纱。
中缀表达式转后缀表达式:理清运算顺序
「基本计算器 II」要求我们计算中缀表达式,其中运算符穿插于操作数之间。为了便于计算,我们需要将中缀表达式转换为后缀表达式,也称逆波兰表达式。
算法要点:
- 利用栈结构,将运算符按优先级入栈
- 操作数直接输出
- 遇到优先级更高的运算符,则将栈顶运算符输出
代码示例:
public static String infixToPostfix(String infix) {
Stack<Character> stack = new Stack<>();
StringBuilder postfix = new StringBuilder();
for (char c : infix.toCharArray()) {
if (Character.isDigit(c)) {
postfix.append(c);
} else if (c == '+' || c == '-') {
while (!stack.isEmpty() && stack.peek() != '(') {
postfix.append(stack.pop());
}
stack.push(c);
} else if (c == '*' || c == '/') {
while (!stack.isEmpty() && (stack.peek() == '*' || stack.peek() == '/')) {
postfix.append(stack.pop());
}
stack.push(c);
} else if (c == '(') {
stack.push(c);
} else if (c == ')') {
while (!stack.isEmpty() && stack.peek() != '(') {
postfix.append(stack.pop());
}
stack.pop();
}
}
while (!stack.isEmpty()) {
postfix.append(stack.pop());
}
return postfix.toString();
}
后缀表达式求值:一步步计算
转换完成后,我们便可计算后缀表达式。
算法要点:
- 利用栈结构,将操作数入栈
- 遇到运算符,则从栈顶弹出两个操作数进行运算
- 将运算结果入栈
代码示例:
public static int evaluatePostfix(String postfix) {
Stack<Integer> stack = new Stack<>();
for (char c : postfix.toCharArray()) {
if (Character.isDigit(c)) {
stack.push(c - '0');
} else {
int num1 = stack.pop();
int num2 = stack.pop();
int result;
switch (c) {
case '+': result = num1 + num2; break;
case '-': result = num2 - num1; break;
case '*': result = num1 * num2; break;
case '/': result = num2 / num1; break;
}
stack.push(result);
}
}
return stack.pop();
}
实战演练:化繁为简
让我们以「2 + 3 * 4」为例。
中缀表达式转后缀表达式:
2 + 3 * 4
2 3 4 * +
后缀表达式求值:
2 3 4 * +
2 12 +
14
通过巧妙地运用中缀表达式转后缀表达式和后缀表达式求值算法,我们轻松地计算出了表达式的值。
总结:算法思维的魅力
「基本计算器 II」算法的精妙之处在于,它将复杂的中缀表达式拆解为易于计算的后缀表达式。通过掌握这两大算法,我们得以征服这道算法难题,领悟算法思维的魅力。
常见问题解答
- 什么是中缀表达式和后缀表达式?
中缀表达式是运算符位于操作数之间的表达式,如「2 + 3 * 4」。后缀表达式是运算符位于操作数之后的表达式,如「2 3 4 * +」。
- 为什么需要将中缀表达式转换为后缀表达式?
后缀表达式可以消除运算符优先级带来的歧义,便于计算。
- 中缀表达式转后缀表达式的算法原理是什么?
利用栈结构,将运算符按优先级入栈,遇到优先级更高的运算符则将栈顶运算符输出。
- 后缀表达式求值的算法原理是什么?
利用栈结构,将操作数入栈,遇到运算符则从栈顶弹出两个操作数进行运算,并将运算结果入栈。
- 掌握这道算法难题有什么好处?
这道算法难题有助于提升算法思维、逻辑推理和代码实现能力,为解决更复杂的问题奠定基础。