【Python】简单计算器实现(三)

解决思路:下一步,我们正式进入计算部分。

定义函数: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

猜你喜欢

转载自blog.csdn.net/m0_64140451/article/details/131747272