简单四则运算解析器
实现一个基本的计算器来计算一个简单的字符串表达式的值。注意事项如下:
- 输入是一个字符串表达式(可以假设所给定的表达式都是有效的)
- 字符串表达式可以包含的运算符号为:左括号
(, 右括号), 加号+, 减号- - 可以包含的数字为:非负整数(< 10)
- 字符串中不包含空格
- 处理除法 case 的时候,可以直接省略小数部分结果,只保留整数部分参与后续运算
- 请不要使用内置的库函数
eval
def solution(expression):
num = [] # 用来存放数字的栈
op = [] # 用来存放运算符的栈
pr = {'+': 1, '-': 1, '*': 2, '/': 2} # 运算符优先级
def eval():
a = num.pop()
b = num.pop()
c = op.pop()
if c == '+':
x = b + a
elif c == '-':
x = b - a
elif c == '*':
x = a * b
else: # c == '/'
x = b // a # 用整除,确保结果为整数
num.append(x)
i = 0
while i < len(expression):
t = expression[i]
if t.isdigit(): # 判断是否为数字
num.append(int(t)) # 将字符转换为数字
elif t == '(':
op.append(t)
elif t == ')':
while op and op[-1] != '(':
eval()
op.pop() # 弹出 '('
else: # 运算符
while op and op[-1] != '(' and pr[op[-1]] >= pr[t]:
eval()
op.append(t)
i += 1
while op: # 处理剩余的运算符
eval()
return num[-1] # 返回最终结果
if __name__ == "__main__":
# You can add more test cases here
print(solution("1+1") == 2)
print(solution("3+4*5/(3+2)") == 7)
print(solution("4+2*5-2/1") == 12)
print(solution("(1+(4+5+2)-3)+(6+8)") == 23)