输入一个表达式(用字符串表示),求这个表达式的值。保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
输入:3+2*{1+2*[-4/(8-6)+7]}
输出:25
方法一:利用eval函数
def calculate_expression(expression:str):
expression = expression.replace('[','(').replace(']',')')
expression = expression.replace('{','(').replace('}',')')
try:
result = eval(expression)
return result
except:
raise ValueError(f"表达式计算出错: {e}")
方法二:栈
from ast import operator
import sys
def calculate(expression: str) -> float:
def evaluate(tokens):
values = []
operators = []
def apply_operator():
right = values.pop()
left = values.pop()
operator = operators.pop()
if operator == "+":
values.append(left + right)
elif operator == "-":
values.append(left - right)
elif operator == "*":
values.append(left * right)
elif operator == "/":
values.append(left / right)
precedence = {"+": 1, "-": 1, "*": 2, "/": 2}
i = 0
while i < len(tokens):
token = tokens[i]
if token.isdigit(): # 处理数字
num = 0
while i < len(tokens) and tokens[i].isdigit():
num = num * 10 + int(tokens[i])
i += 1
values.append(num)
continue
elif token == "-" and (i == 0 or tokens[i - 1] in "+-*/([{"):
# 处理负数(作为一元运算符)
num = 0
i += 1
while i < len(tokens) and tokens[i].isdigit():
num = num * 10 + int(tokens[i])
i += 1
values.append(-num)
continue
elif token in "([{": # 左括号,递归解析子表达式
start = i + 1
balance = 1
while balance != 0:
i += 1
if tokens[i] in "([{":
balance += 1
elif tokens[i] in ")]}":
balance -= 1
values.append(evaluate(tokens[start:i]))
elif token in "+-*/": # 处理操作符
while (
operators and precedence.get(operators[-1], 0) >= precedence[token]
):
apply_operator()
operators.append(token)
elif token in ")]}": # 右括号,跳过(不会发生因为已处理)
pass
i += 1
# 处理剩余的操作符
while operators:
apply_operator()
return values[0]
# 预处理表达式以去除空格并转换为字符列表
tokens = list(expression.replace(" ", ""))
return evaluate(tokens)
for line in sys.stdin:
a = line.split()
print(int(calculate(a[0])))