返回

中缀表达式求值:以解构多层思维,以悟实方法构建解题策略

闲谈

中缀表达式求值是计算机科学中一个经典的问题,也是一个非常重要的算法。它涉及将一个给定的中缀表达式(如“2 + 3 * 4”)转换成一个等价的后缀表达式(如“2 3 4 * +”),然后使用后缀表达式求出结果。

第一步:思维解构

中缀表达式求值的核心思想是将中缀表达式分解成更小的单元,然后使用一种称为“栈”的数据结构来存储这些单元。栈是一种先进后出的数据结构,这意味着最后压入栈中的元素总是第一个被取出。

第二步:构建栈结构

为了求解中缀表达式,我们需要构建一个栈来存储操作数和运算符。我们将操作数压入栈中,并将运算符与它们的优先级一起压入栈中。当遇到一个运算符时,我们将其与栈顶的运算符进行比较。如果当前运算符的优先级高于栈顶运算符的优先级,则将当前运算符压入栈中。否则,我们将栈顶的运算符弹出并与栈顶的操作数进行运算,并将结果压入栈中。

第三步:将中缀表达式转换成后缀表达式

一旦我们将所有运算符都压入栈中,我们就需要将中缀表达式转换成后缀表达式。为了做到这一点,我们将从左到右遍历中缀表达式。如果我们遇到一个操作数,则将其压入输出队列中。如果我们遇到一个运算符,则将其与栈顶的运算符进行比较。如果当前运算符的优先级高于栈顶运算符的优先级,则将当前运算符压入栈中。否则,我们将栈顶的运算符弹出并与栈顶的操作数进行运算,并将结果压入输出队列中。

第四步:求解后缀表达式

一旦我们有了后缀表达式,我们就可以使用它来计算结果。为了做到这一点,我们将从左到右遍历后缀表达式。如果我们遇到一个操作数,则将其压入栈中。如果我们遇到一个运算符,则将其与栈顶的两个操作数进行运算,并将结果压入栈中。当我们遍历完整个后缀表达式时,栈顶的元素就是表达式的值。

代码实现

def evaluate_infix_expression(expression):
    """
    Evaluates a given infix expression.

    Args:
        expression (str): The infix expression to be evaluated.

    Returns:
        int: The value of the expression.
    """

    # Create a stack to store operands and operators.
    stack = []

    # Create a dictionary to store operator priorities.
    operator_priorities = {
        '+': 1,
        '-': 1,
        '*': 2,
        '/': 2,
        '^': 3
    }

    # Convert the infix expression to a postfix expression.
    postfix_expression = ""
    for token in expression:
        if token.isdigit():
            postfix_expression += token
        elif token == '(':
            stack.append(token)
        elif token == ')':
            while stack[-1] != '(':
                postfix_expression += stack.pop()
            stack.pop()
        else:
            while stack and operator_priorities[stack[-1]] >= operator_priorities[token]:
                postfix_expression += stack.pop()
            stack.append(token)

    # Evaluate the postfix expression.
    while stack:
        postfix_expression += stack.pop()

    # Evaluate the postfix expression.
    stack = []
    for token in postfix_expression:
        if token.isdigit():
            stack.append(int(token))
        else:
            operand2 = stack.pop()
            operand1 = stack.pop()
            result = 0
            if token == '+':
                result = operand1 + operand2
            elif token == '-':
                result = operand1 - operand2
            elif token == '*':
                result = operand1 * operand2
            elif token == '/':
                result = operand1 / operand2
            elif token == '^':
                result = operand1 ** operand2
            stack.append(result)

    return stack[-1]

# Example usage
expression = "2 + 3 * 4"
result = evaluate_infix_expression(expression)
print(result)  # Output: 14