[leetcode] 224. Basic Calculator

简易计算器实现与解析表达式字符串
本文介绍如何实现一个能够解析包含加减运算及嵌套括号的简易计算器,详细解释了通过栈操作来处理不同运算符优先级的方法,并提供了实现代码。

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open( and closing parentheses), the plus+ or minus sign-,non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2

" 2-1 + 2 " = 3 "(1+(4+5+2)-3)+(6+8)" = 23

Note:Do not use the eval built-in library function.

这道题是实现一个包含加减和括号的简易计算器,题目难度为Medium。

由于存在括号来改变运算优先级,而且括号可能层层嵌套,所以很自然会想到这里需要用到栈。运算符只有加和减,这样我们可以根据括号之前的运算符来去掉括号,括号之前如果是加号,直接去掉这对括号,如果是减号去掉括号的同时括号之内的运算符要取反(加变减,减变加),这样就可以递归地去掉所有括号。

在实现时不必采用递归,也不用真去掉括号,只需要知道每个运算符在去掉所有括号之后变成何种运算符就可以了。这里可能存在层层嵌套的括号,因而括号之前的符号在转换之后需要进栈,这样可以方便知道本括号内的运算符如何转换。具体地,在遍历到数字时,将数字按十进制移位累加得到当前的数字。在遍历到‘+’或‘-’时,表明前面已经出现一个数,我们根据记录的上一步运算,将这个数累加或累减到最终结果上,同时将记录的数字清零,这里上一步运算符是经转换之后的运算符。然后根据栈顶的符号来对遍历到的运算符进行转换,如果栈顶是1,表明左括号之前是‘+’,这样运算符不变;如果栈顶是-1,表明左括号之前是‘-’,运算符需要取反。遍历到‘(’时,将上一个运算符进栈,以便对括号之内的运算符进行转换。遍历到‘)’时,说明这对括号已经结束,此时需要出栈,将这对括号之前的符号退出。最后加上末尾的数字计算就完成了。具体代码:

class Solution {
public:
    int calculate(string s) {
        stack<int> sign;
        int rst = 0, num = 0;
        int lastSign = 1;
            
        sign.push(1);
        for(auto ch:s) {
            if(ch >= '0' && ch <= '9') {
                num = num*10+ch-'0'; 
            }
            else if(ch == '(') {
                sign.push(lastSign);
            }
            else if(ch == '+' || ch == '-') {
                rst += lastSign*num;
                num = 0;
                lastSign = ((ch == '+') ? 1 : -1) * sign.top();
            }
            else if(ch == ')') {
                sign.pop();
            }
        }
            
        rst += lastSign*num;
            
        return rst;
    }
};

### 如何在 VSCode 中安装和配置 LeetCode 插件以及 Node.js 运行环境 #### 安装 LeetCode 插件 在 VSCode 的扩展市场中搜索 `leetcode`,找到官方提供的插件并点击 **Install** 按钮进行安装[^1]。如果已经安装过该插件,则无需重复操作。 #### 下载与安装 Node.js 由于 LeetCode 插件依赖于 Node.js 环境,因此需要下载并安装 Node.js。访问官方网站 https://nodejs.org/en/ 并选择适合当前系统的版本(推荐使用 LTS 版本)。按照向导完成安装流程后,需确认 Node.js 是否成功安装到系统环境中[^2]。 可以通过命令行运行以下代码来验证: ```bash node -v npm -v ``` 上述命令应返回对应的 Node.js 和 npm 的版本号。如果没有正常返回版本信息,则可能未正确配置环境变量。 #### 解决环境路径问题 即使完成了 Node.js 的安装,仍可能出现类似 “LeetCode extension needs Node.js installed in environment path” 或者 “command ‘leetcode.toggleLeetCodeCn’ not found” 的错误提示[^3]。这通常是因为 VSCode 未能识别全局的 Node.js 路径或者本地安装的 nvm 默认版本未被正确加载[^4]。 解决方法如下: 1. 手动指定 Node.js 可执行文件的位置 在 VSCode 设置界面中输入关键词 `leetcode`,定位至选项 **Node Path**,将其值设为实际的 Node.js 安装目录下的 `node.exe` 文件位置。例如:`C:\Program Files\nodejs\node.exe`。 2. 使用 NVM 用户管理工具调整默认版本 如果通过 nvm 工具切换了不同的 Node.js 版本,请确保设置了默认使用的版本号。可通过以下指令实现: ```bash nvm alias default <version> ``` 重新启动 VSCode 后测试功能键是否恢复正常工作状态。 --- #### 配置常用刷题语言 最后一步是在 VSCode 设置面板中的 LeetCode 插件部分定义个人习惯采用的主要编程语言作为默认提交方式之一。这样可以减少频繁修改编码风格的时间成本。 --- ### 总结 综上所述,要在 VSCode 上顺利启用 LeetCode 插件及其关联服务,除了基本插件本身外还需额外准备支持性的后台框架——即 Node.js 应用程序引擎;同时针对特定场景下产生的兼容性障碍采取针对性措施加以修正即可达成目标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值