解决思路:下一步,我们正式进入计算部分。
定义函数:def final_calc(formula_list)
- formula_list:包含分割开来的数字和运算符
步骤一:定义两个栈。
num_stack = [] # 数字栈
op_stack = [] # 运算符栈
步骤二:循环判断列表 formula_list 中的每一个元素。
情况一:若是数字,则直接压入数字栈中。
if not is_operator(e):
# 字符串转换为浮点数
num_stack.append(float(e))
情况二:若是运算符,则调用上一篇文章中的 decision 函数,判断是应该将运算符压栈、弹栈,还是弹栈并运算。
# 如果运算符栈空则无条件入栈
if len(op_stack) == 0:
op_stack.append(e)
break
当运算符栈不为空时,则需要比较上一个运算符和当前运算符。注意:由于当前运算符还可能小于或等于上上个运算符,因此弹栈并运算后并没有进入下一次大循环,而是继续待在小循环中,直至不满足条件。
tag = decision(op_stack[-1], e)
if tag == -1:
# 压栈后进入下一次大循环
op_stack.append(e)
break
elif tag == 0:
# 弹栈后进入下一次大循环
op_stack.pop()
break
elif tag == 1:
# 弹栈并运算
op = op_stack.pop()
num2 = num_stack.pop()
num1 = num_stack.pop()
# 运算结果压入数字栈
num_stack.append(calculate(num1, num2, op))
步骤三:处理剩余的数字和运算符。
# 处理大循环后,数字栈和运算符栈中可能还剩有元素
while len(op_stack) != 0:
op = op_stack.pop()
num2 = num_stack.pop()
num1 = num_stack.pop()
num_stack.append(calculate(num1, num2, op))
整段代码
def final_calc(formula_list):
num_stack = []
op_stack = []
for e in formula_list:
if not is_operator(e):
num_stack.append(float(e))
else:
while True:
if len(op_stack) == 0:
op_stack.append(e)
break
tag = decision(op_stack[-1], e)
if tag == -1:
op_stack.append(e)
break
elif tag == 0:
op_stack.pop()
break
elif tag == 1:
op = op_stack.pop()
num2 = num_stack.pop()
num1 = num_stack.pop()
num_stack.append(calculate(num1, num2, op))
while len(op_stack) != 0:
op = op_stack.pop()
num2 = num_stack.pop()
num1 = num_stack.pop()
num_stack.append(calculate(num1, num2, op))
return num_stack, op_stack