当前位置:网站首页>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
边栏推荐
- Infrared camera: juge infrared mag32 product introduction
- 老板被隔离了
- Introduction to microservice architecture
- 猫猫回收站
- Modify the system time of Px4 flight control
- Analyze "C language" [advanced] paid knowledge [II]
- 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
- 红外相机:巨哥红外MAG32产品介绍
- Zabbix 5.0:通过LLD方式自动化监控阿里云RDS
- Big guys gather | nextarch foundation cloud development meetup is coming!
猜你喜欢

Flir Blackfly S 工业相机 介绍

Blackfly s usb3 industrial camera: buffer processing

将截断字符串或二进制数据

STM32F4---PWM输出

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

Zhang Ping'an: accelerate cloud digital innovation and jointly build an industrial smart ecosystem

ROS learning (24) plugin

CISP-PTE实操练习讲解(二)

Schedulx v1.4.0 and SaaS versions are released, and you can experience the advanced functions of cost reduction and efficiency increase for free!

FLIR blackfly s industrial camera: auto exposure configuration and code
随机推荐
Flir Blackfly S 工业相机:通过外部触发实现多摄像头同步拍摄
ROS learning (24) plugin
Blackfly s usb3 industrial camera: buffer processing
A new path for enterprise mid Platform Construction -- low code platform
Metaforce force meta universe development and construction - fossage 2.0 system development
Cisp-pte practice explanation (II)
String to date object
大咖云集|NextArch基金会云开发Meetup来啦!
企业中台建设新路径——低代码平台
开发中对集合里面的数据根据属性进行合并数量时犯的错误
ROS learning (26) dynamic parameter configuration
CISP-PTE之命令注入篇
投资的再思考
How can I code for 8 hours without getting tired.
Recommended collection!! Which is the best flutter status management plug-in? Please look at the ranking list of yard farmers on the island!
Several classes and functions that must be clarified when using Ceres to slam
Processing image files uploaded by streamlit Library
猿桌派第三季开播在即,打开出海浪潮下的开发者新视野
How to use strings as speed templates- How to use String as Velocity Template?
MetaForce原力元宇宙开发搭建丨佛萨奇2.0系统开发