给定一个算式运算,算式由运算数和+、-、*、/、(、)组成,请编写程序判断该算式运算是否合法。如果合法,计算该算式的值。
时间: 2024-12-18 20:30:11 浏览: 1
为了判断一个给定的算术表达式是否合法并计算其值,你可以按照以下步骤创建一个简单的解析器。这里我们假设使用递归下降解析法:
1. 定义一些基本规则:
- 每个数字字符都是有效的运算数。
- 开始符(开始)和结束符(结束)可以是空字符串。
- 加号(+)、减号(-)、乘号(*)、除号(/)用于连接操作数。
- 左括号(()用于包围需要先计算的部分,右括号()与之对应。
2. 创建函数:
- `is_valid` 函数检查输入是否只包含有效字符,并保证正确的括号配对。
- `evaluate` 函数递归地处理表达式,遇到加减乘除则计算两个操作数的结果,遇到括号则先计算括号内的部分。
```python
def is_valid(expression):
stack = []
for char in expression:
if char.isdigit():
continue
elif char == '(':
stack.append(char)
elif char == ')':
if not stack or stack.pop() != '(':
return False
return not stack
def evaluate(expression):
def helper(left, right):
nonlocal operator
if operator == '+':
return left + right
elif operator == '- right
elif operator == '*':
return left * right
elif operator == '/':
if right == 0:
raise ValueError('Division by zero')
return left / right
num = ''
operator = None
for char in expression:
if char.isdigit():
num += char
else:
if num:
result = int(num)
num = ''
if operator:
result = helper(result, evaluate(rest))
yield result
operator = char
rest = expression[len(num):]
if num:
yield int(num)
if operator:
yield evaluate(rest)
# 使用示例
expression = '5 + (3 * 4) / 2'
if is_valid(expression):
try:
result = sum(evaluate(expression))
print(f"表达式 {expression} 的值是:{result}")
except ValueError as e:
print(f"错误:{e}")
else:
print("表达式无效")
```
阅读全文