当前位置:网站首页>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
边栏推荐
- Tips for web development: skillfully use ThreadLocal to avoid layer by layer value transmission
- 15million employees are easy to manage, and the cloud native database gaussdb makes HR office more efficient
- Big guys gather | nextarch foundation cloud development meetup is coming!
- MySQL's most basic select statement
- Scenario practice: quickly build wordpress blog system based on function calculation
- Recognition of C language array
- Infrared camera: juge infrared mag32 product introduction
- freeswitch拨打分机号源代码跟踪
- Flir Blackfly S工业相机:颜色校正讲解及配置与代码设置方法
- Zhang Ping'an: accelerate cloud digital innovation and jointly build an industrial smart ecosystem
猜你喜欢

建议收藏!!Flutter状态管理插件哪家强?请看岛上码农的排行榜!

TiFlash 源码阅读(四)TiFlash DDL 模块设计及实现分析

Blackfly s usb3 industrial camera: buffer processing

Dall-E Mini的Mega版本模型发布,已开放下载

Errors made in the development of merging the quantity of data in the set according to attributes

Modify the system time of Px4 flight control

Livox激光雷达硬件时间同步---PPS方法

Analyze "C language" [advanced] paid knowledge [End]

The GPG keys listed for the "MySQL 8.0 community server" repository are already ins

处理streamlit库上传的图片文件
随机推荐
组合导航:中海达iNAV2产品描述及接口描述
FLIR blackfly s industrial camera: auto exposure configuration and code
一片葉子兩三萬?植物消費爆火背後的“陽謀”
一片叶子两三万?植物消费爆火背后的“阳谋”
ROS learning (23) action communication mechanism
ROS学习(十九)机器人SLAM功能包——cartographer
Batch delete data in SQL - set in entity
Draco - glTF模型压缩利器
@Before, @after, @around, @afterreturning execution sequence
New generation cloud native message queue (I)
freeswitch拨打分机号源代码跟踪
XML to map tool class xmlmaputils (tool class V)
Web开发小妙招:巧用ThreadLocal规避层层传值
Correct use of BigDecimal
ROS学习(26)动态参数配置
阿里云中间件开源往事
Metaforce force meta universe development and construction - fossage 2.0 system development
RC振荡器和晶体振荡器简介
Tips for web development: skillfully use ThreadLocal to avoid layer by layer value transmission
Golang foundation - data type