【栈】LeetCode 224. 基本计算器

题目链接

224. 基本计算器

思路

image

代码

class Solution {
    public int calculate(String s) {
        // 存放所有的数字
        Deque<Integer> nums = new ArrayDeque<>();
        // 为了防止第一个数为负数,先往 nums 加个 0
        nums.addLast(0);
        // 将所有的空格去掉
        s = s.replaceAll(" ", "");
        // 存放所有的操作,包括 +/-
        Deque<Character> ops = new ArrayDeque<>();
        int n = s.length();
        char[] cs = s.toCharArray();
        for(int i = 0; i < n; i++){
            char c = cs[i];
            if(c == '('){
                ops.addLast(c);
            }else if(c == ')'){
                // 计算到最近一个左括号为止
                while(!ops.isEmpty()){
                    char op = ops.peekLast();
                    if(op != '('){
                        calc(nums, ops);
                    }else{
                        ops.pollLast();
                        break;
                    }
                }
            }else{
                if(Character.isDigit(c)){
                    int u = 0;
                    int j = i;
                    // 将从 i 位置开始后面的连续数字整体取出,加入 nums
                    while(j < n && Character.isDigit(cs[j])){
                        u = u * 10 + (int) (cs[j++] - '0');
                    }
                    nums.addLast(u);
                    i = j - 1;
                }else{
                    if(i > 0 && cs[i - 1] == '('){
                        nums.addLast(0);
                    }
                    // 有一个新操作要入栈时,先把栈内可以算的都算了
                    while(!ops.isEmpty() && ops.peekLast() != '('){
                        calc(nums, ops);
                    }
                    ops.addLast(c);
                }
            }
        }

        while(!ops.isEmpty()){
            calc(nums, ops);
        }

        return nums.peekLast();
    }

    void calc(Deque<Integer> nums, Deque<Character> ops) {
        if(nums.isEmpty() || nums.size() < 2){
            return;
        }
        if(ops.isEmpty()){
            return;
        }

        int b = nums.pollLast(), a = nums.pollLast();
        char op = ops.pollLast();
        nums.addLast(op == '+' ? a + b : a - b);
    }
}
posted @   Frodo1124  阅读(49)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示