def calculate(expression):
    operators = []
    operands = []

    def get_priority(operator):
        if operator == '+' or operator == '-':
            return 1
        elif operator == '*' or operator == '/':
            return 2
        elif operator == '^':
            return 3
        elif operator == '(' or operator == ')':
            return 0
        else:
            return -1

    def apply_operator(operator):
        b = operands.pop()
        a = operands.pop()
        if operator == '+':
            operands.append(a + b)
        elif operator == '-':
            operands.append(a - b)
        elif operator == '*':
            operands.append(a * b)
        elif operator == '/':
            if b == 0:
                raise ValueError('INVALID')
            operands.append(a // b)
        elif operator == '^':
            result = 1
            for _ in range(b):
                result *= a
            operands.append(result)

    def calculate_expression():
        while operators and operators[-1] != '(':
            operator = operators.pop()
            apply_operator(operator)

    num = ''
    for char in expression:
        if char.isdigit():
            num += char
        else:
            if num:
                operands.append(int(num))
                num = ''
            if char == '(':
                operators.append(char)
            elif char == ')':
                while operators and operators[-1] != '(':
                    operator = operators.pop()
                    apply_operator(operator)
                operators.pop()  # 弹出左括号
            else:
                priority = get_priority(char)
                while operators and priority <= get_priority(operators[-1]):
                    operator = operators.pop()
                    apply_operator(operator)
                operators.append(char)

    if num:
        operands.append(int(num))

    calculate_expression()

    return operands[0]

# 读取输入的中缀表达式
expressions = []
while True:
    try:
        expression = input()
        if not expression:
            break
        expressions.append(expression)
    except EOFError:
        break

# 计算并输出结果
for expression in expressions:
    try:
        result = calculate(expression)
        print(result)
    except ValueError as e:
        print(str(e))

这段代码实现了用栈来处理中缀表达式的计算,并进行了一些优化以提升效率:

  1. get_priority 函数移至 calculate_expression 内部,避免重复调用该函数。
  2. 将获取运算符优先级的结果存储为局部变量 priority,避免多次调用 get_priority 函数。
  3. 在处理运算符时,只有在当前运算符的优先级大于栈顶运算符的优先级时才进行运算,避免不必要的计算。

这些优化可以减少重复计算的次数,有效提高程序的运行效率。

Python实现中缀表达式计算器:优化算法提升效率

原文地址: https://www.cveoy.top/t/topic/iz7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录