📅  最后修改于: 2023-12-03 15:27:25.815000             🧑  作者: Mango
算术表达式评估是计算机基础中的一个重要主题,其对于计算机科学及相关领域都有着广泛的应用。本篇文章主要介绍算术表达式评估的相关概念、算法以及实现。
算术表达式是由数字、运算符、括号及变量等组成的表达式。通常使用中缀表达式来表示算术表达式,例如1+2*(3-4)
就是一个中缀表达式。
算术表达式的评估通常采用栈来实现,具体的算法流程如下:
(
,则将其入栈。)
,则依次将栈内运算符出栈并计算,直到遇到对应的左括号为止。左括号本身不需要计算,应该在遇到右括号时弹出并丢弃。基于上述算法流程,我们可以使用代码来实现算术表达式的评估。以下是一个实现示例(Python语言实现):
def evaluate_expression(expression):
operator_stack = [] # 运算符栈
operand_stack = [] # 操作数栈
def higher_precedence(op1, op2):
# 返回op1优先级是否高于op2
return (op1 == '*' or op1 == '/') and (op2 == '+' or op2 == '-')
for i in range(len(expression)):
# 如果是数字则入操作数栈
if expression[i].isdigit():
num = int(expression[i])
while (i + 1 < len(expression) and expression[i+1].isdigit()):
num = num * 10 + int(expression[i+1])
i += 1
operand_stack.append(num)
elif expression[i] == '(':
operator_stack.append(expression[i])
elif expression[i] == ')':
while operator_stack[-1] != '(':
op = operator_stack.pop()
b = operand_stack.pop()
a = operand_stack.pop()
operand_stack.append(eval(f"{a}{op}{b}"))
operator_stack.pop() # 弹出左括号
elif expression[i] in ['+', '-', '*', '/']:
while operator_stack and operator_stack[-1] != '(' and higher_precedence(operator_stack[-1], expression[i]):
op = operator_stack.pop()
b = operand_stack.pop()
a = operand_stack.pop()
operand_stack.append(eval(f"{a}{op}{b}"))
operator_stack.append(expression[i])
while operator_stack:
op = operator_stack.pop()
b = operand_stack.pop()
a = operand_stack.pop()
operand_stack.append(eval(f"{a}{op}{b}"))
return operand_stack[-1] # 操作数栈内应只剩下一个结果
算术表达式评估是计算机基础中非常重要的主题,在程序员日常工作及学习中都有广泛的应用。理解并掌握其相关算法和实现方式对程序员而言是十分必要的。