当前位置:网站首页>leetcode:736. LISP syntax parsing [flowery + stack + status enumaotu + slots]
leetcode:736. LISP syntax parsing [flowery + stack + status enumaotu + slots]
2022-07-07 02:24:00 【White speed Dragon King's review】
analysis
Look at knowledge without logic
Enum + auto
Setting up id The state of , It can be understood as “ Static state variables of class ”
Used to judge and identify unique States , You can use is Judge
solts
About solts Usage of , It can also be understood as “ Static variable of class ”
Once a class is modified , The value of all instances will change
ac code
from enum import Enum, auto
class ExprStatus(Enum):
VALUE = auto() # The initial state
NONE = auto() # Unknown expression type
LET = auto() # let expression
LET1 = auto() # let The expression has been parsed vi Variable
LET2 = auto() # let The expression has parsed the last expression expr
ADD = auto() # add expression
ADD1 = auto() # add The expression has been parsed e1 expression
ADD2 = auto() # add The expression has been parsed e2 expression
MULT = auto() # mult expression
MULT1 = auto() # mult The expression has been parsed e1 expression
MULT2 = auto() # mult The expression has been parsed e2 expression
DONE = auto() # Parsing complete
class Expr:
#__slots__ = 'status', 'var', 'value', 'e1', 'e2'
def __init__(self, status):
self.status = status
self.var = '' # let The variable of vi
self.value = 0 # VALUE The number of States , perhaps LET2 The value of the last expression of the state
self.e1 = self.e2 = 0 # add or mult Two expressions of expression e1 and e2 The numerical
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 # Remove space
continue
if expression[i] == '(':
i += 1 # Remove the left parenthesis
s.append(cur)
cur = Expr(ExprStatus.NONE)
continue
if expression[i] == ')': # In essence, it turns the expression into a token
i += 1 # Remove the closing bracket
if cur.status is ExprStatus.LET2:
token = str(cur.value)
for var in vars[-1]:
scope[var].pop() # Clear scope
vars.pop()
elif cur.status is ExprStatus.ADD2:
token = str(cur.e1 + cur.e2)
else:
token = str(cur.e1 * cur.e2)
cur = s.pop() # Get the upper level status
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([]) # Record all variables in the scope of this layer , Convenient for subsequent removal
elif token == "add":
cur.status = ExprStatus.ADD
elif token == "mult":
cur.status = ExprStatus.MULT
elif cur.status is ExprStatus.LET:
if expression[i] == ')': # let The last of the expression expr expression
cur.value = calculateToken(token)
cur.status = ExprStatus.LET2
else:
cur.var = token
vars[-1].append(token) # Record all variables in the scope of this layer , Convenient for subsequent removal
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
summary
After a few months
I also found a daily problem that I don't even want to see the solution
nice
边栏推荐
- Cisp-pte practice explanation (II)
- MFC Windows 程序设计[147]之ODBC数据库连接(附源码)
- Web3对法律的需求
- 建議收藏!!Flutter狀態管理插件哪家强?請看島上碼農的排行榜!
- [server data recovery] data recovery case of a Dell server crash caused by raid damage
- 4--新唐nuc980 挂载initramfs nfs文件系统
- 企业中台建设新路径——低代码平台
- postgresql之整體查詢大致過程
- Web开发小妙招:巧用ThreadLocal规避层层传值
- 激光雷达:Ouster OS产品介绍及使用方法
猜你喜欢
FLIR blackfly s industrial camera: explanation and configuration of color correction and code setting method
Flir Blackfly S工业相机:颜色校正讲解及配置与代码设置方法
Draco - glTF模型压缩利器
将截断字符串或二进制数据
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
一片葉子兩三萬?植物消費爆火背後的“陽謀”
老板被隔离了
1个月增长900w+播放!总结B站顶流恰饭的2个新趋势
Introduction to FLIR blackfly s industrial camera
Lumion 11.0软件安装包下载及安装教程
随机推荐
[leetcode] day97 remove linked list elements
阿里云易立:云原生如何破解企业降本提效难题?
Introduction to RC oscillator and crystal oscillator
What to do when encountering slow SQL? (next)
【论文阅读|深读】RolNE: Improving the Quality of Network Embedding with Structural Role Proximity
【森城市】GIS数据漫谈(二)
最近小程序开发记录
The boss is quarantined
How can reinforcement learning be used in medical imaging? A review of Emory University's latest "reinforcement learning medical image analysis", which expounds the latest RL medical image analysis co
Halcon实例转OpenCvSharp(C# OpenCV)实现--瓶口缺陷检测(附源码)
人脸识别应用解析
Redis tool class redisutil (tool class III)
企业中台建设新路径——低代码平台
A new path for enterprise mid Platform Construction -- low code platform
MFC Windows 程序设计[147]之ODBC数据库连接(附源码)
激光雷达:Ouster OS产品介绍及使用方法
Flir Blackfly S 工业相机:配置多个摄像头进行同步拍摄
解密函数计算异步任务能力之「任务的状态及生命周期管理」
Yyds dry goods inventory # solve the real problem of famous enterprises: maximum difference
Detailed explanation of line segment tree (including tested code implementation)