385. Mini Parser

来源:互联网 发布:医疗器械软件 编辑:程序博客网 时间:2024/05/22 04:26

Given a nested list of integers represented as a string, implement a parser to deserialize it.

Each element is either an integer, or a list – whose elements may also be integers or other lists.

Note: You may assume that the string is well-formed:

String is non-empty.
String does not contain white spaces.
String contains only digits 0-9, [, - ,, ].
Example 1:

Given s = "324",You should return a NestedInteger object which contains a single integer 324.

Example 2:

Given s = "[123,[456,[789]]]",Return a NestedInteger object containing a nested list with 2 elements:1. An integer containing value 123.2. A nested list containing two elements:    i.  An integer containing value 456.    ii. A nested list with one element:         a. An integer containing value 789.
/** * // 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) {        Stack<NestedInteger> stack = new Stack<NestedInteger>();        String temp = "";        for(char c: s.toCharArray()){            switch(c){                case '[':                    stack.push(new NestedInteger()); //start a new NI                    break;                case ']':                    if(!temp.equals("")){                        stack.peek().add(new NestedInteger(Integer.parseInt(temp))); //add NI to parent                        temp="";                    }                    NestedInteger top = stack.pop();                    if(!stack.empty()){                        stack.peek().add(top);                    }else{                        return top;                    }                    break;                case ',':                    if(!temp.equals("")){                        stack.peek().add(new NestedInteger(Integer.parseInt(temp)));//add NI to parent                        temp="";                    }                    break;                default:                    temp += c;            }        }        if(!temp.equals("")){            return new NestedInteger(Integer.parseInt(temp));        }        return null;    }}