题解 | #表达式求值# 不使用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-11 13:34
门头沟学院 C++
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
06-11 17:39
门头沟学院 Java
小呆呆的大鼻涕:卧槽,用户彻底怒了
点赞 评论 收藏
分享
07-02 13:52
武汉大学 golang
骗你的不露头也秒
牛客87776816...:😃查看图片
点赞 评论 收藏
分享
评论
11
1
分享

创作者周榜

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