返回
栈实现四则运算——后缀表达式大显身手
闲谈
2023-11-23 09:13:52
在计算机科学中,栈是一种线性数据结构,遵循后进先出(LIFO)原则。它允许我们通过 push 和 pop 操作分别添加和删除元素。栈在各种应用程序中都有广泛的应用,其中之一就是四则运算的求值。
逆波兰(后缀)表达式
后缀表达式,也称为逆波兰表示法,是一种将操作符放在其操作数之后表示算术表达式的表示法。与中缀表达式(正常表达式)不同,它消除了对括号的需求。
例如,中缀表达式 (3 + 4) * 5
在后缀表达式中表示为 3 4 + 5 *
。
利用栈求解后缀表达式
我们可以使用栈来有效地求解后缀表达式。算法如下:
- 将表达式分割成单个符号(操作数和操作符)。
- 初始化一个空栈。
- 对于表达式的每个符号:
- 如果它是操作数,则将其推入栈中。
- 如果它是操作符,则从栈中弹出两个操作数,对其执行操作,并将结果推入栈中。
- 当表达式被完全处理后,栈中剩下的元素就是表达式的结果。
示例
让我们使用栈来求解后缀表达式 3 4 + 5 *
。
- 将表达式分割成符号:
3
,4
,+
,5
,*
- 初始化一个空栈。
- 对于每个符号:
3
: 推入栈中。4
: 推入栈中。+
: 从栈中弹出4
和3
,执行4 + 3
,得到结果7
并推入栈中。5
: 推入栈中。*
: 从栈中弹出5
和7
,执行5 * 7
,得到结果35
并推入栈中。
- 栈中的元素
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
总结
使用栈来求解后缀表达式是一种有效且优雅的方法。通过将操作数和操作符存储在栈中,我们可以按照操作的先后顺序执行计算,最终得到表达式的结果。这种方法在编译器和计算器等应用程序中得到广泛应用。