输入格式: 第一行给出一个不超过10的正整数k; 接下来k行,每行给出一个后缀式,后缀式的格式如上文所描述,1位操作数且无空格间隔。 输出格式: 输出有k行,对于所输入的每个后缀式,判断是否正确(可求值),并在一行里输出: 如果后缀式无误、可求值,输出结果 如果发现除数为0,则输出Division By Zero! 如果发现其它错误,则输出Expression Error!
时间: 2024-02-24 22:57:54 浏览: 19
对于这个问题,我可以提供一个基于Python的解决方案。你可以将以下代码保存为一个.py文件,然后在命令行中执行python <文件名>来运行程序。
```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 len(self.items) == 0
def evaluate_postfix(expression):
stack = Stack()
for token in expression:
if token.isdigit():
stack.push(int(token))
else:
try:
operand2 = stack.pop()
operand1 = stack.pop()
result = evaluate_expression(token, operand1, operand2)
stack.push(result)
except (IndexError, ZeroDivisionError):
return "Expression Error!"
return stack.pop()
def evaluate_expression(operator, operand1, operand2):
if operator == '+':
return operand1 + operand2
elif operator == '-':
return operand1 - operand2
elif operator == '*':
return operand1 * operand2
elif operator == '/':
if operand2 == 0:
raise ZeroDivisionError
return operand1 // operand2 # integer division
else:
raise ValueError("Invalid operator")
def is_valid_postfix(expression):
stack = Stack()
for token in expression:
if token.isdigit():
stack.push(token)
else:
try:
operand2 = stack.pop()
operand1 = stack.pop()
evaluate_expression(token, int(operand1), int(operand2))
stack.push('1')
except (IndexError, ValueError, ZeroDivisionError):
return False
return stack.is_empty()
if __name__ == '__main__':
k = int(input())
for i in range(k):
expression = input().split()
if is_valid_postfix(expression):
try:
result = evaluate_postfix(expression)
print(result)
except ZeroDivisionError:
print("Division By Zero!")
else:
print("Expression Error!")
```
这个程序实现了一个后缀式求值器,它支持加、减、乘、除四种操作,并且可以检测除数为0和表达式格式错误的情况。在主函数中,我们首先读入k,表示后面有k行输入。对于每行输入,我们先检查其是否为合法的后缀式,如果是,则尝试求值并输出结果;如果不是,则输出错误信息。