基本计算器

描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

提示:

1 <= s.length <= 3 * 105
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
输入中不存在两个连续的操作符
每个数字和运行的计算将适合于一个有符号的 32位 整数

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

思路

栈存临时结果和符号

代码

复制代码
class Solution {
      public int calculate(String s) {
        Deque<Integer> stack = new ArrayDeque<>();
        int sign = 1;//1:正,0:负
        int res = 0;
        int length = s.length();
        char[] chars = s.toCharArray();
        for (int i = 0; i < length; i++) {
            char ch = chars[i];
            if (Character.isDigit(ch)){
                int cur = ch - '0';
                while (i+1 < length && Character.isDigit(chars[i+1])){
                    cur = cur * 10 + (chars[i+1] - '0');
                    i++;
                }
                res = res + sign * cur;
            }
            else if (ch == '+'){
                sign = 1;
            }
            else if (ch == '-'){
                sign = -1;
            }
            else if (ch == '('){
                stack.push(res);
                res = 0;
                stack.push(sign);
                sign = 1;
            }
            else if (ch == ')'){
                res = stack.pop() * res + stack.pop();
            }
        }
        return res;
    }
}
复制代码

 

posted @   冬马党  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示