当前位置:网站首页>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
边栏推荐
- 最近小程序开发记录
- Halcon knowledge: segment_ contours_ XLD operator
- ROS learning (24) plugin
- 【Unity】升级版·Excel数据解析,自动创建对应C#类,自动创建ScriptableObject生成类,自动序列化Asset文件
- 机器人队伍学习方法,实现8.8倍的人力回报
- 【论文阅读|深读】 GraphSAGE:Inductive Representation Learning on Large Graphs
- How did partydao turn a tweet into a $200million product Dao in one year
- 一片叶子两三万?植物消费爆火背后的“阳谋”
- Errors made in the development of merging the quantity of data in the set according to attributes
- String to date object
猜你喜欢
TiFlash 源码阅读(四)TiFlash DDL 模块设计及实现分析
Decryption function calculates "task state and lifecycle management" of asynchronous task capability
ROS learning (XX) robot slam function package -- installation and testing of rgbdslam
强化学习如何用于医学影像?埃默里大学最新《强化学习医学影像分析》综述,阐述最新RL医学影像分析概念、应用、挑战与未来方向
解密函数计算异步任务能力之「任务的状态及生命周期管理」
Make DIY welding smoke extractor with lighting
go swagger使用
Time synchronization of livox lidar hardware -- PPS method
ROS学习(26)动态参数配置
Cat recycling bin
随机推荐
投资的再思考
Flir Blackfly S 工业相机 介绍
MySQL execution process and sequence
使用Ceres进行slam必须要弄清楚的几个类和函数
Modify the system time of Px4 flight control
Unicode string converted to Chinese character decodeunicode utils (tool class II)
【论文阅读|深读】 GraphSAGE:Inductive Representation Learning on Large Graphs
Cisp-pte practice explanation (II)
长安链学习笔记-证书研究之证书模式
Collection recommandée!! Quel plug - in de gestion d'état flutter est le plus fort? Regardez le classement des manons de l'île, s'il vous plaît!
2022/0524/bookstrap
处理streamlit库上传的图片文件
centos8安裝mysql報錯:The GPG keys listed for the “MySQL 8.0 Community Server“ repository are already ins
Yiwen takes you into [memory leak]
NPM install compilation times "cannot read properties of null (reading 'pickalgorithm')“
Domestic images of various languages, software and systems. It is enough to collect this warehouse: Thanks mirror
Flir Blackfly S工业相机:颜色校正讲解及配置与代码设置方法
张平安:加快云上数字创新,共建产业智慧生态
Time synchronization of livox lidar hardware -- PPS method
The GPG keys listed for the "MySQL 8.0 community server" repository are already ins