Python实现中缀表达式计算器:优化算法提升效率
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))
这段代码实现了用栈来处理中缀表达式的计算,并进行了一些优化以提升效率:
- 将
get_priority函数移至calculate_expression内部,避免重复调用该函数。 - 将获取运算符优先级的结果存储为局部变量
priority,避免多次调用get_priority函数。 - 在处理运算符时,只有在当前运算符的优先级大于栈顶运算符的优先级时才进行运算,避免不必要的计算。
这些优化可以减少重复计算的次数,有效提高程序的运行效率。
原文地址: https://www.cveoy.top/t/topic/iz7 著作权归作者所有。请勿转载和采集!