返回

栈实现四则运算——后缀表达式大显身手

闲谈

在计算机科学中,栈是一种线性数据结构,遵循后进先出(LIFO)原则。它允许我们通过 push 和 pop 操作分别添加和删除元素。栈在各种应用程序中都有广泛的应用,其中之一就是四则运算的求值。

逆波兰(后缀)表达式

后缀表达式,也称为逆波兰表示法,是一种将操作符放在其操作数之后表示算术表达式的表示法。与中缀表达式(正常表达式)不同,它消除了对括号的需求。

例如,中缀表达式 (3 + 4) * 5 在后缀表达式中表示为 3 4 + 5 *

利用栈求解后缀表达式

我们可以使用栈来有效地求解后缀表达式。算法如下:

  1. 将表达式分割成单个符号(操作数和操作符)。
  2. 初始化一个空栈。
  3. 对于表达式的每个符号:
    • 如果它是操作数,则将其推入栈中。
    • 如果它是操作符,则从栈中弹出两个操作数,对其执行操作,并将结果推入栈中。
  4. 当表达式被完全处理后,栈中剩下的元素就是表达式的结果。

示例

让我们使用栈来求解后缀表达式 3 4 + 5 *

  1. 将表达式分割成符号:3, 4, +, 5, *
  2. 初始化一个空栈。
  3. 对于每个符号:
    • 3: 推入栈中。
    • 4: 推入栈中。
    • +: 从栈中弹出 43,执行 4 + 3,得到结果 7 并推入栈中。
    • 5: 推入栈中。
    • *: 从栈中弹出 57,执行 5 * 7,得到结果 35 并推入栈中。
  4. 栈中的元素 35 就是表达式的结果。

代码示例

使用 Python,我们可以实现一个栈并使用它来求解后缀表达式:

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

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

    def pop(self):
        return self.items.pop()

    def is_empty(self):
        return self.items == []


def evaluate_postfix(expression):
    stack = Stack()
    operators = {'+', '-', '*', '/'}

    for token in expression:
        if token in operators:
            operand2 = stack.pop()
            operand1 = stack.pop()
            result = do_math(token, operand1, operand2)
            stack.push(result)
        else:
            stack.push(int(token))

    return stack.pop()


def do_math(op, op1, op2):
    if op == '+':
        return op1 + op2
    elif op == '-':
        return op1 - op2
    elif op == '*':
        return op1 * op2
    else:
        try:
            return int(op1 / op2)
        except ZeroDivisionError:
            raise ValueError("Cannot divide by 0")


expression = "3 4 + 5 *"
result = evaluate_postfix(expression)
print(result)  # 输出:35

总结

使用栈来求解后缀表达式是一种有效且优雅的方法。通过将操作数和操作符存储在栈中,我们可以按照操作的先后顺序执行计算,最终得到表达式的结果。这种方法在编译器和计算器等应用程序中得到广泛应用。