返回

打造自定义计算器:使用栈巧妙解决算数难题

后端

各位技术爱好者,大家好!今天,我们踏上了一段激动人心的旅程,学习如何利用栈来构建一个功能强大的简单计算器。准备好潜入计算机科学的奥妙世界了吗?

让我们从一个简单的问题开始:什么是栈?在计算机科学中,栈是一种数据结构,遵循先进后出的原则,即后添加的元素将首先被移除。想想看,就像叠在一起的盘子,每次添加一个新的盘子时,它都会放在顶部,而当您需要拿走一个盘子时,您只能拿走最上面的那个。

使用栈构建计算器

现在,让我们把栈的魔力应用到计算器中。传统计算器接受中缀表达式,即操作符位于操作数中间,例如 1 + 1。然而,为了利用栈的优点,我们将采用后缀表达式,其中操作符位于操作数之后,如 1 1 +。

后缀表达式的优点在于,它不需要括号或运算符优先级规则。因此,我们可以使用一个简单的栈来计算任何后缀表达式。

步骤详解

  • 初始化栈: 从一个空栈开始。
  • 遍历输入的后缀表达式:
    • 如果遇到数字,将其压入栈中。
    • 如果遇到操作符,则弹出栈顶的两个元素作为操作数,执行操作,并将结果压入栈中。
  • 最后留在栈中的元素 就是表达式的结果。

代码示例:

class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()
        else:
            return None

    def peek(self):
        if not self.is_empty():
            return self.items[-1]
        else:
            return None

    def is_empty(self):
        return len(self.items) == 0

def evaluate_postfix(expression):
    stack = Stack()
    for token in expression:
        if token.isdigit():
            stack.push(int(token))
        else:
            operand2 = stack.pop()
            operand1 = stack.pop()
            result = do_math(token, operand1, operand2)
            stack.push(result)
    return stack.pop()

def do_math(op, op1, op2):
    if op == '+':
        return op1 + op2
    elif op == '-':
        return op1 - op2
    elif op == '*':
        return op1 * op2
    elif op == '/':
        return op1 / op2
    else:
        raise ValueError("Invalid operator")

# 使用示例
expression = "1 1 +"
result = evaluate_postfix(expression)
print("结果:", result)

总结

通过利用栈的先进后出特性,我们可以轻松有效地计算后缀表达式。这种方法避免了复杂的运算符优先级规则,使我们的计算器既强大又易于使用。

掌握了这些技能,你将能够打造一个定制的计算器,轻松解决各种算术难题。快去实践吧,让你的代码成为计算的利器!