【算法】leetcode 385. 迷你语法分析器

这篇博客介绍了一个用于解析整数嵌套列表的语法分析器的实现。该分析器通过栈数据结构处理输入字符串,识别并处理数字、负号、括号等元素,最终返回NestedInteger对象。解析过程中,遇到'['创建新的NestedInteger对象,遇到'-'或数字则生成对应的NestedInteger,并在遇到']'时将子列表添加到父列表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。

列表中的每个元素只可能是整数或整数嵌套列表

class Solution {
    public NestedInteger deserialize(String s) {
        /**

         */
        Deque<NestedInteger> stack = new LinkedList<>();
        char[] charArr = s.toCharArray();
        int i=0;
        int n=charArr.length;
        NestedInteger flagNI = new NestedInteger();
        boolean isNegative = false;
        int num = 0;
        while(i<n){
            /**
               1. 当前字符为,跳过
               2. 当前字符为[ 新建一个NI对象,并插入一个标识对象
               3. 当前字符为 '-'或者数字,读取该数值,生成NI对象入栈
               4. 当前字符为']',开始弹栈,用list存储弹出的NI对象,直到遇到标识对象,将标识对象的前序对象作为父NI。
             */
            if(charArr[i]=='['){
                NestedInteger ni = new NestedInteger();
                stack.addLast(ni);
                stack.addLast(flagNI);
            }else if(charArr[i]==']'){
                List<NestedInteger> list = new ArrayList<>();
                while(!stack.isEmpty() && stack.peekLast()!=flagNI){
                    list.add(stack.pollLast());
                }
                stack.pollLast();//弹出标志NI
                NestedInteger parent = stack.peekLast();
                for(int j=list.size()-1;j>=0;j--){
                    parent.add(list.get(j));
                }
            }else if(charArr[i]=='-'){
                isNegative = true;
            }else if(charArr[i]>='0' && charArr[i]<='9'){
                num = num*10 + charArr[i]-'0';
                if(i==n-1 || charArr[i+1]<'0' || charArr[i+1]>'9'){
                    NestedInteger ni = new NestedInteger();
                    num=isNegative==true?-num:num;
                    ni.setInteger(num);
                    stack.addLast(ni);
                    isNegative=false;
                    num=0;
                }
            }
            i++;
        }
        return stack.peek();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值