Stack-LeetCode224

  1. 基本计算器

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

示例 1:

输入:s = “1 + 1”
输出:2

示例 2:

输入:s = " 2-1 + 2 " 输出:3

示例 3:

输入:s = “(1+(4+5+2)-3)+(6+8)”
输出:23

提示:

1 <= s.length <= 3 * 105
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
class Solution {
    public int calculate(String s) {
        int num = 0, sign = 1, res = 0; //分别代表:右侧数字,中间符号,左侧数字
        Deque<Integer> stack = new ArrayDeque(); // stack中存放左侧数字和中间运算符,
        //中间运算符表示右侧数字的正负值
        for (char ch : s.toCharArray()) {
            if (ch == ' ') continue;
            if(ch <= '9' && ch >= '0') {
                num = num * 10 + ch - '0';
            } 
            if (ch == '+' || ch == '-') {
                res += sign * num; // res开始计算,此时的sign是前一个数字num的符号,不是当前ch
                sign = ch == '+' ? 1 : -1;
                num = 0; // 遇到符号需要初始化
            } 
            if (ch == '(') { // 将所有左侧数字计算出,用res和sign表示
                stack.push(res);
                stack.push(sign);
                //初始化res和sign,(前面不可能是数字,所以num一定是为0
                res = 0;
                sign = 1;
            }
            if (ch == ')') {
                res += num*sign; //res 为当前括号中的计算和
                res = res * stack.pop() + stack.pop();
                sign = 1; //sign初始化为1
                num = 0;
            }
        }
        res += num*sign; // 当表达式最后一个为纯数字时,需要增加一步计算
        return res;
    


        // // 先将字符串格式化
        // StringBuilder sb = new StringBuilder();
        // char cur = s.charAt(0);
        // if (cur == '+' || cur == '-') sb.append("0");
        // char former = s.charAt(1);
        // for (int i = 2; i < s.length(); i++) {
        //     cur = s.charAt(i);
        //     if(former == '(' && (cur == '+' || cur == '-')) {
        //         sb.append("0");
        //         former = cur;
        //     }
        //     sb.append(cur);
        // }
        // s = sb.toString();
        // int res = 0;
        // Deque<String> stack = new ArrayDeque();
        // int tmp = 0;
        // for (char ch : s.toCharArray()) {
        //     if (ch == ' ') continue;
        //     if (isNum(ch)) {
        //         tmp = tmp*10 + ch - '0';
        //     } else { // 如果是运算符或者括号    
        //         if (ch == '+' || ch == '-') {
        //             stack.push(tmp);
        //             stack.push(ch);
        //             tmp = 0;
        //         } else { // 如果是括号
        //             if (ch == '(') stack.push(ch);
        //             if (ch == ')') {
                        
        //             }
        //         }
        //     }
        // }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值