当前位置:网站首页>leetcode:736. Lisp 语法解析【花里胡哨 + 栈 + 状态enumaotu + slots】
leetcode:736. Lisp 语法解析【花里胡哨 + 栈 + 状态enumaotu + slots】
2022-07-06 18:37:00 【白速龙王的回眸】
分析
不看逻辑看知识
Enum + auto
设置固定id的状态,可以理解为“类的静态状态变量”
用于判断和标识独有的状态,可用is判断
solts
关于solts的用法,也是可以理解为“类的静态变量”
类一旦做一个修改,所有的实例的值都会变
ac code
from enum import Enum, auto
class ExprStatus(Enum):
VALUE = auto() # 初始状态
NONE = auto() # 表达式类型未知
LET = auto() # let 表达式
LET1 = auto() # let 表达式已经解析了 vi 变量
LET2 = auto() # let 表达式已经解析了最后一个表达式 expr
ADD = auto() # add 表达式
ADD1 = auto() # add 表达式已经解析了 e1 表达式
ADD2 = auto() # add 表达式已经解析了 e2 表达式
MULT = auto() # mult 表达式
MULT1 = auto() # mult 表达式已经解析了 e1 表达式
MULT2 = auto() # mult 表达式已经解析了 e2 表达式
DONE = auto() # 解析完成
class Expr:
#__slots__ = 'status', 'var', 'value', 'e1', 'e2'
def __init__(self, status):
self.status = status
self.var = '' # let 的变量 vi
self.value = 0 # VALUE 状态的数值,或者 LET2 状态最后一个表达式的数值
self.e1 = self.e2 = 0 # add 或 mult 表达式的两个表达式 e1 和 e2 的数值
class Solution:
def evaluate(self, expression: str) -> int:
scope = defaultdict(list)
def calculateToken(token: str) -> int:
return scope[token][-1] if token[0].islower() else int(token)
vars = []
s = []
cur = Expr(ExprStatus.VALUE)
i, n = 0, len(expression)
while i < n:
if expression[i] == ' ':
i += 1 # 去掉空格
continue
if expression[i] == '(':
i += 1 # 去掉左括号
s.append(cur)
cur = Expr(ExprStatus.NONE)
continue
if expression[i] == ')': # 本质上是把表达式转成一个 token
i += 1 # 去掉右括号
if cur.status is ExprStatus.LET2:
token = str(cur.value)
for var in vars[-1]:
scope[var].pop() # 清除作用域
vars.pop()
elif cur.status is ExprStatus.ADD2:
token = str(cur.e1 + cur.e2)
else:
token = str(cur.e1 * cur.e2)
cur = s.pop() # 获取上层状态
else:
i0 = i
while i < n and expression[i] != ' ' and expression[i] != ')':
i += 1
token = expression[i0:i]
if cur.status is ExprStatus.VALUE:
cur.value = int(token)
cur.status = ExprStatus.DONE
elif cur.status is ExprStatus.NONE:
if token == "let":
cur.status = ExprStatus.LET
vars.append([]) # 记录该层作用域的所有变量, 方便后续的清除
elif token == "add":
cur.status = ExprStatus.ADD
elif token == "mult":
cur.status = ExprStatus.MULT
elif cur.status is ExprStatus.LET:
if expression[i] == ')': # let 表达式的最后一个 expr 表达式
cur.value = calculateToken(token)
cur.status = ExprStatus.LET2
else:
cur.var = token
vars[-1].append(token) # 记录该层作用域的所有变量, 方便后续的清除
cur.status = ExprStatus.LET1
elif cur.status is ExprStatus.LET1:
scope[cur.var].append(calculateToken(token))
cur.status = ExprStatus.LET
elif cur.status is ExprStatus.ADD:
cur.e1 = calculateToken(token)
cur.status = ExprStatus.ADD1
elif cur.status is ExprStatus.ADD1:
cur.e2 = calculateToken(token)
cur.status = ExprStatus.ADD2
elif cur.status is ExprStatus.MULT:
cur.e1 = calculateToken(token)
cur.status = ExprStatus.MULT1
elif cur.status is ExprStatus.MULT1:
cur.e2 = calculateToken(token)
cur.status = ExprStatus.MULT2
return cur.value
总结
时隔几个月
又找到一道我连题解都不想看的每日一题
nice
边栏推荐
- Recent applet development records
- FLIR blackfly s usb3 industrial camera: white balance setting method
- Flir Blackfly S 工业相机 介绍
- Decryption function calculates "task state and lifecycle management" of asynchronous task capability
- Command injection of cisp-pte
- STM32F4---通用定时器更新中断
- 猿桌派第三季开播在即,打开出海浪潮下的开发者新视野
- Infrared camera: juge infrared mag32 product introduction
- Jacob Steinhardt, assistant professor of UC Berkeley, predicts AI benchmark performance: AI has made faster progress in fields such as mathematics than expected, but the progress of robustness benchma
- Golang foundation - data type
猜你喜欢
Flir Blackfly S 工业相机:通过外部触发实现多摄像头同步拍摄
Ros Learning (23) Action Communication Mechanism
Flir Blackfly S 工业相机:配置多个摄像头进行同步拍摄
【论文阅读|深读】 GraphSAGE:Inductive Representation Learning on Large Graphs
将截断字符串或二进制数据
【论文阅读|深读】DNGR:Deep Neural Networks for Learning Graph Representations
张平安:加快云上数字创新,共建产业智慧生态
ROS学习(24)plugin插件
微服务架构介绍
ROS学习(23)action通信机制
随机推荐
ROS learning (26) dynamic parameter configuration
The foreground downloads network pictures without background processing
组合导航:中海达iNAV2产品描述及接口描述
Recent applet development records
STM32F4---PWM输出
String to date object
CISP-PTE之命令注入篇
开发中对集合里面的数据根据属性进行合并数量时犯的错误
投资的再思考
Chang'an chain learning notes - certificate model of certificate research
Time synchronization of livox lidar hardware -- PPS method
centos8安装mysql报错:The GPG keys listed for the “MySQL 8.0 Community Server“ repository are already ins
2022/0524/bookstrap
【服务器数据恢复】raid损坏导致戴尔某型号服务器崩溃的数据恢复案例
阿里云中间件开源往事
遇到慢SQL该怎么办?(下)
freeswitch拨打分机号源代码跟踪
Redis configuration class redisconfig
建议收藏!!Flutter状态管理插件哪家强?请看岛上码农的排行榜!
一片叶子两三万?植物消费爆火背后的“阳谋”