题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
class Solution: def solve(self , s1: str) -> int: def epr(s, i): cur, i = fac(s, i) # epr = fac { +- fac } data, k = cur, i cur, i = get(s, i) while type(cur) is str and cur in '+-': cur_next, i = fac(s, i) if cur == '+': data += cur_next if cur == '-': data -= cur_next cur, i = get(s, i) k = i - 1 return data, k def fac(s, i): # fac = itm { * / itm} cur, i = itm(s, i) data, k = cur, i cur, i = get(s, i) while type(cur) is str and cur == '*': cur_next, i = itm(s, i) if cur == '*': data *= cur_next if cur == '/': data /= cur_next cur, i = get(s, i) k = i - 1 return data, k def itm(s, i): # itm = digits | (epr) cur, i = get(s, i) if cur == '(': cur, i = epr(s, i) _, i = get(s, i) # ')' return cur, i def get(s, i): if i >= len(s): return None, i if s[i] in '()*+-': return s[i], i + 1 # match characters k = i while k < len(s) and s[k].isdigit(): k += 1 # match digits, return next index return int(s[i:k]), k return epr(s1, 0)[0]