Leetcode 736. Lisp 语法解析

news/2025/10/3 16:37:46/文章来源:https://www.cnblogs.com/ganking/p/19124723
  • 首先给每个变量都开一个stack,用来记录当前的值

  • 然后再开四个stack

  • var记录运算符和还未复制的变量

  • op记录当前仍在处理的运算符

  • num记录还没处理的数字

  • s记录的东西和var一样,用于退栈

  • 遇到数字,如果有没有赋值的变量(说明当前op.top()=="let"),则进行赋值,更新这个变量的栈,否则说明是参与运算(add或mult)的,加入num中

  • 如果遇到的是运算符直接加入

  • 如果遇到变量,需要考虑的有两点

    • 前面运算符是add或mult,那么直接将这个变量替换成数值,并加入num即可,无需其他操作
    • 如果前面的是let,那么仍然要分两种情况,一种是在赋值运算符的左边,一种是在赋值运算符的右边
    • 如果当前var栈顶是变量,那么就是作为赋值运算符的右边给左边赋值,直接给对应的变量赋值即可,无需其他操作
    • 否则,如果右边是')',说明是let表达式最后一个,那么直接将该变量的值,push进num中,否则应当加入var中
  • 当我们遇到')'

    • 如果是add或者mult,那么从num中取出最后两个数计算
    • 如果是let,那么就是num中最后一个数
    • 然后利用s进行一个退栈的处理
    • 然后我们将当前这个处理好的运算符退栈,然后看这个新的结果能不能赋值给前面的变量
class Solution {
public:bool check(string s) { return s == "add" || s == "mult" || s == "let"; }int evaluate(string expression) {unordered_map<string, stack<int>> val;stack<string> var, op, s;stack<int> num;int now = 0, sign = 1, j;string& str = expression;for (int i = 0; i < str.length(); ++i) {if (str[i] == ' ' || str[i] == '(')continue;if (str[i] == '-')sign = -1;else if (isdigit(str[i])) {now = str[i] - '0';j = i;while (j + 1 < str.length() && isdigit(str[j + 1])) {now = now * 10 - '0' + str[++j];}i = j;now *= sign;sign = 1;if (!check(var.top())) {val[var.top()].push(now);var.pop();} else {num.push(now);}} else if (str[i] == ')') {int x, y, z;if (op.top() == "add" || op.top() == "mult") {x = num.top();num.pop();y = num.top();num.pop();if (op.top() == "add")z = x + y;elsez = x * y;} else {z = num.top();num.pop();}var.pop();while (s.top() != op.top()) {val[s.top()].pop();s.pop();}s.pop();if (!var.empty() && !check(var.top())) {val[var.top()].push(z);var.pop();} elsenum.push(z);op.pop();} else {string t = "";t += str[i];j = i;while (j + 1 < str.length() && str[j + 1] != ' ' &&str[j + 1] != ')') {t += str[++j];}i = j;if (check(t)) {s.push(t);op.push(t);var.push(t);} else {if (op.top() == "add" || op.top() == "mult") {num.push(val[t].top());} else {if (!check(var.top())) {val[var.top()].push(val[t].top());var.pop();} else {if (str[j + 1] != ')') {var.push(t);s.push(t);} else {num.push(val[t].top());}}}}}}return num.top();}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做服装到哪个网站拿货品质好商业网站是怎么做的

目录 1.正整数下标 2.负整数下标 3.空下标与零下标 4.下标超界 5.逻辑下标 6. which()、which.min()、which.max() 函数 7. 元素名 8.用 R 向量下标作映射 9.集合运算 练习 1.正整数下标 首先定义一个x&#xff0c;然后对向量 x, 在后面加方括号和下标可以访问向量…

随想八

随想八1.“我不要你觉得 我要你确定” ——《万物生灵》法南 2.对太容易获得的东西产生迷恋,就像一个赌徒对赌博上瘾。2025-08-27 01:33:25 1.不要说爱,说点具体的,比如感恩、依靠和挂念、自身价值、责任感。2025-0…

【600】

【600】按照惯例,又到了记录时间没什么好讲的,这段时间集中刷了50道 1500 的题,所以比较快累积到题量,再加上CF这个月非常密集,导致800水题贡献了20+,所以这次水分很多 尽管每场都没鸽,但是rating 还是没有动静…

SolarWinds Web Help Desk远程代码执行漏洞分析

本文详细分析了SolarWinds Web Help Desk中发现的严重安全漏洞CVE-2025-26399,该漏洞允许攻击者未经身份验证实现远程代码执行,影响12.8.7及之前所有版本,威胁等级为高危。SolarWinds Web Help Desk远程代码执行漏洞…

Aria2安装

1 安装sudo pacman -S aria22 创建配置文件 cd ~ mkdir .aria2 cd .aria2 touch aria2.conf aria2.log aria2.session 3 修改配置文件aria2.conf 需要自己配置rpc-secret和bt-tracker bt-tracker可以去trackerslist网站…

正则表达式学习

学习正则的网站: https://regexlearn.com/zh-cn/learn/ 基础速查: https://regexlearn.com/zh-cn/cheatsheet 1. 限定字符集符号/模式 描述 示例 解释. 匹配任意字符(除换行符外) /a.b/ 匹配 "a" 后面跟着…

神经网络之简单的标量何以表达模型的拟合能力 - 指南

神经网络之简单的标量何以表达模型的拟合能力 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&quo…

一篇文章入门RabbitMQ:基本概念与Java利用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

软件开发 网页设计网站如何更改网站的关键词

一、xlutils是什么是一个提供了许多操作修改excel文件方法的库&#xff1b;属于python的第三方模块xlrd库用于读取excel文件中的数据&#xff0c;xlwt库用于将数据写入excel文件&#xff0c;修改用xlutils模块&#xff1b;xlutils库也仅仅是通过复制一个副本进行操作后保存一个…

PHP程序员要是基础不扎实,越学越吃力

PHP程序员要是基础不扎实,越学越吃力2025-10-03 16:17 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

wap网站开发兰州百姓网免费发布信息网站

Ubuntu下文件/目录对比的软件Meld可能有很多用户还不是很熟悉&#xff0c;下文就给大家介绍如何安装Meld和移植到Gedit下。具体内容如下所述。 Meld允许用户查看文件、目录间的变化。很容易移植到Gedit下&#xff0c;方便用户使用。 安装Meld Meld默认在Ubuntu官方源中&#…

深入解析:[特殊字符]函数指针:C语言的动态灵魂,嵌入式的超能力(202589)

深入解析:[特殊字符]函数指针:C语言的动态灵魂,嵌入式的超能力(202589)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

酒类产品网站设计做海外购网站

上博士为了毕业写学术论文头都大了&#xff0c;但更难受的是英语不咋地&#xff0c;投稿后经常会因为语言问题而惨遭拒稿&#xff0c;每每想起就令人心情郁郁&#xff0c;天台可期。有些审稿人也会直接告知需要专业的修改&#xff0c;那咋整呢&#xff0c;让润色呗&#xff0c;…

网站可以做二维码吗哈尔滨最大的互联网公司

相信很多电脑用户都知道&#xff0c;电脑系统在运行的时候会产生系统日志&#xff0c;它可以记录系统中的硬件、软件和系统的各种问题信息&#xff0c;可以通过它检索错误发生的原因&#xff0c;不过时间长了&#xff0c;这类日志文件就会积压&#xff0c;导致系统存储变小&…

lesson70:jQuery Ajax完全指南:从基础到4.0新特性及现代替代优秀的方案引言:jQuery Ajax的时代价值与演进

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《电路基础》第八章学习笔记

《电路基础》第八章学习笔记本章学习二阶电路,典型是RLC电路。电路中包含三种无源元件(两种储能元件)。可以用二阶微分方程表征其特性。初值与终值的确定关键点:分析电路时,必须始终仔细地处理电容器两端电压v(t)…

《电路基础》第七章学习笔记

《电路基础》第七章学习笔记本章主要介绍一阶电路,需要用到一阶微分方程来表征无源RC电路形成: 一个电阻器与一个已充电电容器组成的串联电路,当直流电源突然断开时,就会得到无源RC电路。由这个图,我们对顶点使用…

XGBoost

XGBoostXGBoost的算法原理 ​ 设选择了使用$k$个Tree来拟合数据,XGBoost的原理是使用第一颗树来拟合原始数据,得到$\hat y_1$,然后用$\hat y_1$替换原来的$y$,再用第二颗树来拟合数据。最终的预测结果是每个数的预…

LLM大模型:deepseek sparse attention是个啥?

1、近期,deepseek-3.2-EXP发布,价格大幅下降,如下:价格大幅下降,这是谁给的底气了?必定是成本大幅下降呗,否则不得亏死?那么问题又来了:成本又是怎么大幅下降的了?2、时至今日,尽管被各种吐槽(其中不乏yan…