当前位置:网站首页>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
边栏推荐
- 投资的再思考
- 解密函数计算异步任务能力之「任务的状态及生命周期管理」
- This week's hot open source project!
- 建議收藏!!Flutter狀態管理插件哪家强?請看島上碼農的排行榜!
- 一片叶子两三万?植物消费爆火背后的“阳谋”
- 3--新唐nuc980 kernel支持jffs2, Jffs2文件系统制作, 内核挂载jffs2, uboot网口设置,uboot支持tftp
- Twenty or thirty thousand a leaf? "Yang Mou" behind the explosion of plant consumption
- postgresql之integerset
- SchedulX V1.4.0及SaaS版发布,免费体验降本增效高级功能!
- Vingt - trois mille feuilles? "Yang mou" derrière l'explosion de la consommation végétale
猜你喜欢
The boss is quarantined
Introduction to FLIR blackfly s industrial camera
leetcode:736. Lisp 语法解析【花里胡哨 + 栈 + 状态enumaotu + slots】
A new path for enterprise mid Platform Construction -- low code platform
【Unity】升级版·Excel数据解析,自动创建对应C#类,自动创建ScriptableObject生成类,自动序列化Asset文件
红外相机:巨哥红外MAG32产品介绍
FLIR blackfly s usb3 industrial camera: white balance setting method
Word wrap when flex exceeds width
新一代云原生消息队列(一)
[paper reading | deep reading] dngr:deep neural networks for learning graph representations
随机推荐
【LeetCode】Day97-移除链表元素
张平安:加快云上数字创新,共建产业智慧生态
[C # notes] reading and writing of the contents of text files
Data connection mode in low code platform (Part 1)
Detailed explanation of line segment tree (including tested code implementation)
GEE升级,可以实现一件run tasks
Overall query process of PostgreSQL
Flir Blackfly S USB3 工业相机:白平衡设置方法
一片葉子兩三萬?植物消費爆火背後的“陽謀”
Cisp-pte practice explanation (II)
Unicode string converted to Chinese character decodeunicode utils (tool class II)
STM32项目 -- 选题分享(部分)
[C # notes] use file stream to copy files
最近小程序开发记录
#yyds干货盘点# 解决名企真题:最大差值
Introduction to FLIR blackfly s industrial camera
【服务器数据恢复】raid损坏导致戴尔某型号服务器崩溃的数据恢复案例
张平安:加快云上数字创新,共建产业智慧生态
Stm32f4 --- PWM output
Web3的先锋兵:虚拟人