题解 | #表达式求值# 不使用eval函数

表达式求值

http://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

import re

chars = input()
chars = re.sub(r"([-+*/()])", r" \1 ", chars)
tmp = chars.split()
tokens = []
#处理负数
f = False
for i, x in enumerate(tmp):
	if f == True:
		f = False
		continue
	if x == '-' and (i == 0 or tmp[i-1] == '('):
		tokens.append(''.join(tmp[i:i+2]))
		f = True
	else:
		tokens.append(x)

ops = []
vals = []

precedence = {'+':1, '-':1, '*':2, '/':2, '(':0}

def applyOp(v1, v2, op):
	if op == '+': return v1 + v2
	if op == '-': return v1 - v2
	if op == '*': return v1 * v2
	if op == '/': return v1 // v2

for t in tokens:
	if t != '-' and t[0] == '-' or t.isdigit():
		vals.append(int(t))
	elif t == '(':
		ops.append(t)
	elif t == ')':
		while len(ops) > 0 and ops[-1] != '(':
			v2 = vals.pop()
			v1 = vals.pop()
			op = ops.pop()
			val = applyOp(v1, v2, op)
			vals.append(val)
		ops.pop()
	else:
		while len(ops) > 0 and precedence[ops[-1]] >= precedence[t]:
			v2 = vals.pop()
			v1 = vals.pop()
			op = ops.pop()
			val = applyOp(v1, v2, op)
			vals.append(val)
		ops.append(t)


while len(ops) > 0:
	v2 = vals.pop()
	v1 = vals.pop()
	op = ops.pop()
	val = applyOp(v1, v2, op)
	vals.append(val)


print(vals[-1])
全部评论
请问处理负数这部分可以详细说明一下吗?感谢!
点赞 回复 分享
发布于 2022-09-07 21:45 德国

相关推荐

不愿透露姓名的神秘牛友
06-27 14:11
很喜欢小米的新车,校招薪资每月22k,攒多久能买?
测试糕手手:别看工资,先看现金流存款。有50W存款以上再考虑,车是消耗品,选适合自己的重要。你有钱就当我没说过
点赞 评论 收藏
分享
05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
评论
11
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务