LeetCode 每日一题 (一)

 Lisp语法解析

 以下是先参考别人的代码段​​​​​​https://leetcode.cn/problems/parse-lisp-expression/solution/c-8ms-9467-73mb-bian-li-yi-ci-biao-da-shi-gou-zao-/

1、①const char *str: 代表着str是一个指向char的常量,就是不能通过改变str来改变所指向的内容。但是可以通过改变char所定义的数组从而改变其中指向的内容。

②char *const str: 这里就是定义了一个指针变量,可以通过改变str来改变数组指向内容元素的值。

这参考了const char *str,char const *str,char *const str的区别,及const详解_一个山里的少年的博客-CSDN博客

2. .rbegin()为逆向迭代器,指向字符串的最后一个字符。 .rend()为逆向迭代器,指向字符串第一个字符的前一个位置。

3.b.find('a',x)表示从string字符串第x位开始寻找字符串a的位置。

4.emplace_back()在实现时,则是直接在容器的尾部创建这个元素,省去了拷贝或移动元素的过程。

class Solution:
    def evaluate(self, expression: str) -> int:
        def f(vals,obj):                    #求值函数f,vals是符号表,obj是表达式
            if isinstance(obj,tuple):       #如果是元组,就递归求解
                if obj[0]=='let':           #根据obj[0]执行对应的操作
                    vals=vals.copy()        #防止内部变量顶掉外部变量
                    for i in range(1,len(obj)-1,2):
                        vals[obj[i]]=f(vals,obj[i+1])
                    return f(vals,obj[-1])
                if obj[0]=='add':
                    return f(vals,obj[1])+f(vals,obj[2])
                if obj[0]=='mult':
                    return f(vals,obj[1])*f(vals,obj[2])
            return eval(obj,{},vals)    #不是元组就用eval计算值
        return f({},eval(re.sub(r'([^( )]+)',r"'\1'",expression).replace(' ',',')))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值