返回
中缀表达式求值:以解构多层思维,以悟实方法构建解题策略
闲谈
2023-12-28 13:57:23
中缀表达式求值是计算机科学中一个经典的问题,也是一个非常重要的算法。它涉及将一个给定的中缀表达式(如“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