返回

直面 227:算法挑战,破解基本计算器 II

前端

揭秘算法竞赛中的「基本计算器 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」算法的精妙之处在于,它将复杂的中缀表达式拆解为易于计算的后缀表达式。通过掌握这两大算法,我们得以征服这道算法难题,领悟算法思维的魅力。

常见问题解答

  1. 什么是中缀表达式和后缀表达式?

中缀表达式是运算符位于操作数之间的表达式,如「2 + 3 * 4」。后缀表达式是运算符位于操作数之后的表达式,如「2 3 4 * +」。

  1. 为什么需要将中缀表达式转换为后缀表达式?

后缀表达式可以消除运算符优先级带来的歧义,便于计算。

  1. 中缀表达式转后缀表达式的算法原理是什么?

利用栈结构,将运算符按优先级入栈,遇到优先级更高的运算符则将栈顶运算符输出。

  1. 后缀表达式求值的算法原理是什么?

利用栈结构,将操作数入栈,遇到运算符则从栈顶弹出两个操作数进行运算,并将运算结果入栈。

  1. 掌握这道算法难题有什么好处?

这道算法难题有助于提升算法思维、逻辑推理和代码实现能力,为解决更复杂的问题奠定基础。