📜  算术表达式评估(1)

📅  最后修改于: 2023-12-03 15:27:25.815000             🧑  作者: Mango

算术表达式评估

算术表达式评估是计算机基础中的一个重要主题,其对于计算机科学及相关领域都有着广泛的应用。本篇文章主要介绍算术表达式评估的相关概念、算法以及实现。

算术表达式

算术表达式是由数字、运算符、括号及变量等组成的表达式。通常使用中缀表达式来表示算术表达式,例如1+2*(3-4)就是一个中缀表达式。

算法

算术表达式的评估通常采用栈来实现,具体的算法流程如下:

  1. 遍历中缀表达式,遇到数字则直接入栈,遇到运算符和括号则分情况处理。
  2. 遇到左括号( ,则将其入栈。
  3. 遇到右括号) ,则依次将栈内运算符出栈并计算,直到遇到对应的左括号为止。左括号本身不需要计算,应该在遇到右括号时弹出并丢弃。
  4. 遇到运算符,则依次弹出栈中优先级高于当前运算符的运算符进行计算,直到栈顶运算符优先级低于等于当前运算符为止。然后将当前运算符入栈。
  5. 最后将栈内剩余的运算符弹出进行计算,最终得到表达式的结果。
实现

基于上述算法流程,我们可以使用代码来实现算术表达式的评估。以下是一个实现示例(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]  # 操作数栈内应只剩下一个结果
结语

算术表达式评估是计算机基础中非常重要的主题,在程序员日常工作及学习中都有广泛的应用。理解并掌握其相关算法和实现方式对程序员而言是十分必要的。