美文网首页
栈-N385-迷你语法分析器

栈-N385-迷你语法分析器

作者: 三次元蚂蚁 | 来源:发表于2019-04-10 12:42 被阅读0次

    题目

    • 概述:给定一个用字符串表示的整数的嵌套列表,列表中的每个元素只能是整数或者整数嵌套列表,实现一个解析它的语法分析器

    • 输入:字符串表示的整数的嵌套列表

      字符串非空

      字符串不包含空格

      字符串只包含数字0-9,[,],,,-

      示例1:“324”

      示例2:“[123,[456,[789]]]”

    • 输出:NestedInteger对象,详见代码注释

    • 出处:https://leetcode-cn.com/problems/mini-parser/

    思路

    • 由于是嵌套的,所以考虑用栈实现

    • 遍历字符串:

      1. '[' => 创建NestedInteger对象放入栈中
      2. 数字或'-' => 拼接到数字字符串上
      3. ',' => 若数字字符串不为空("[[],[]]"),将数字字符串转换为数字并加入到栈顶的NestedInteger对象中,将数字字符串清空
      4. ']' => 若数字字符串不为空,则执行3,然后将栈顶元素出栈加入到出栈后的栈顶元素中(若没有栈顶元素则直接返回该答案)
    • 若最后数字字符串不为空("123"),则创建只带数字的NestedInteger对象并返回

    代码

    /**
     * // This is the interface that allows for creating nested lists.
     * // You should not implement it, or speculate about its implementation
     * public interface NestedInteger {
     *     // Constructor initializes an empty nested list.
     *     public NestedInteger();
     *
     *     // Constructor initializes a single integer.
     *     public NestedInteger(int value);
     *
     *     // @return true if this NestedInteger holds a single integer, rather than a nested list.
     *     public boolean isInteger();
     *
     *     // @return the single integer that this NestedInteger holds, if it holds a single integer
     *     // Return null if this NestedInteger holds a nested list
     *     public Integer getInteger();
     *
     *     // Set this NestedInteger to hold a single integer.
     *     public void setInteger(int value);
     *
     *     // Set this NestedInteger to hold a nested list and adds a nested integer to it.
     *     public void add(NestedInteger ni);
     *
     *     // @return the nested list that this NestedInteger holds, if it holds a nested list
     *     // Return null if this NestedInteger holds a single integer
     *     public List<NestedInteger> getList();
     * }
     */
    class Solution {
        public NestedInteger deserialize(String s) {
            LinkedList<NestedInteger> stack = new LinkedList<>();
            StringBuilder numberStr = new StringBuilder();
            NestedInteger top;
            
            for (char c : s.toCharArray()) {
                switch (c) {
                    case '[':
                        stack.push(new NestedInteger());
                        break;
                    case ',':
                        if (numberStr.length() > 0) {
                            stack.peek().add(new NestedInteger(Integer.parseInt(numberStr.toString())));
                        numberStr = new StringBuilder();
                        }
                        break;
                    case ']':
                        if (numberStr.length() > 0) {
                            stack.peek().add(new NestedInteger(Integer.parseInt(numberStr.toString())));
                        numberStr = new StringBuilder();
                        }
                        
                        top = stack.pop();
                        if (stack.isEmpty()) {
                            return top;
                        } else {
                            stack.peek().add(top);
                        }
                        break;
                    default:
                        numberStr.append(c);
                        break;
                }
            }
            
            if (numberStr.length() > 0) {
                return new NestedInteger(Integer.parseInt(numberStr.toString()));
            } else {
                return stack.peek();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:栈-N385-迷你语法分析器

          本文链接:https://www.haomeiwen.com/subject/tedniqtx.html