在Python编程入门教程中,实现一个Python栈式计算器是理解栈数据结构Python实现和表达式求值的绝佳练习。本文将手把手教你如何使用 Python 构建一个能够计算后缀表达式(也称逆波兰表达式)的栈式计算器,即使你是编程小白,也能轻松跟上!

栈(Stack)是一种“后进先出”(LIFO, Last In First Out)的数据结构。你可以把它想象成一摞盘子:你只能从最上面放盘子或拿盘子。
在计算器中,栈用于暂存数字,当我们遇到运算符时,就从栈顶取出两个数字进行运算,再把结果压回栈中。
我们平时写的算式如 3 + 4 * 2 是中缀表达式,它需要处理运算符优先级和括号,比较复杂。
而后缀表达式(如 3 4 2 * +)不需要括号,也不用考虑优先级,非常适合用栈来计算。这也是很多编译器和计算器内部采用的方式。
首先,我们用 Python 列表(list)来实现一个栈:
class Stack: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() else: raise IndexError("栈为空,无法弹出元素") def peek(self): if not self.is_empty(): return self.items[-1] else: return None def size(self): return len(self.items)接下来,我们写一个函数 evaluate_postfix,它接收一个后缀表达式字符串(例如 "3 4 2 * +"),并返回计算结果。
def evaluate_postfix(expression): stack = Stack() # 将表达式按空格分割成 tokens tokens = expression.split() for token in tokens: if token in "+-*/": # 遇到运算符,弹出两个操作数 if stack.size() < 2: raise ValueError("表达式格式错误:运算符过多") b = stack.pop() # 注意顺序:先弹出的是右操作数 a = stack.pop() # 后弹出的是左操作数 if token == '+': result = a + b elif token == '-': result = a - b elif token == '*': result = a * b elif token == '/': if b == 0: raise ZeroDivisionError("除数不能为零") result = a / b stack.push(result) else: # 如果是数字,压入栈 try: number = float(token) stack.push(number) except ValueError: raise ValueError(f"无效的 token: {token}") # 最后栈中应只剩一个元素,即结果 if stack.size() != 1: raise ValueError("表达式格式错误:数字过多或运算符不足") return stack.pop()现在,我们可以测试几个例子:
# 测试用例print(evaluate_postfix("3 4 +")) # 输出: 7.0print(evaluate_postfix("3 4 2 * +")) # 输出: 11.0print(evaluate_postfix("15 7 1 1 + - / 3 * 2 1 1 + + -")) # 输出: 5.0如果你希望用户直接输入 3 + 4 * 2 这样的中缀表达式,你需要先将其转换为后缀表达式。这通常使用调度场算法(Shunting Yard Algorithm)实现,涉及运算符优先级和括号处理。这是更高级的内容,但掌握了栈之后,你已经打下了坚实基础!
通过本教程,你学会了:
这个项目不仅巩固了你的 Python 基础,还让你深入理解了编译原理中的表达式求值机制。继续加油,你离成为 Python 高手又近了一步!
记住,掌握后缀表达式计算和Python编程入门教程中的核心概念,是你迈向更复杂编程任务的关键一步。
本文由主机测评网于2025-12-14发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025127419.html