/**
* // This is the interface that allows for creating nested lists.
* // You should not implement it, or speculate about its implementation
* class NestedInteger {
* public:
* // Constructor initializes an empty nested list.
* NestedInteger();
*
* // Constructor initializes a single integer.
* NestedInteger(int value);
*
* // Return true if this NestedInteger holds a single integer, rather than a nested list.
* bool isInteger() const;
*
* // Return the single integer that this NestedInteger holds, if it holds a single integer
* // The result is undefined if this NestedInteger holds a nested list
* int getInteger() const;
*
* // Set this NestedInteger to hold a single integer.
* void setInteger(int value);
*
* // Set this NestedInteger to hold a nested list and adds a nested integer to it.
* void add(const NestedInteger &ni);
*
* // Return the nested list that this NestedInteger holds, if it holds a nested list
* // The result is undefined if this NestedInteger holds a single integer
* const vector<NestedInteger> &getList() const;
* };
*/
class Solution {
public:
NestedInteger deserialize(string s) {
bool level=false;
int len=s.size();
if(s[0]=='[')
{
level=true;
len-=2;
s=s.substr(1,len);
}
NestedInteger obj;
//for(int i=0;s[i]!='\0';i++)
for(int i=0;i<len;i++)
{
if(isdigit(s[i])||s[i]=='-')
{
string tmp="";
while(i<len&&(isdigit(s[i])||s[i]=='-'))
{
tmp+=s[i++];
}
int item=atoi(tmp.c_str());
NestedInteger ni(item);
if(level)
obj.add(ni);
else
obj.setInteger(item);
}
else if(s[i]=='[')
{
int cnt=1;
int sta=i;
i++;
while(i<len&&cnt!=0)
{
if(s[i]=='[')
cnt++;
else if(s[i]==']')
cnt--;
i++;
}
string tmp=s.substr(sta,i-sta);
NestedInteger cur=deserialize(tmp);
obj.add(cur);
}
}
return obj;
}
};
/*
"123"
"-11"
*/
update:
/**
* // This is the interface that allows for creating nested lists.
* // You should not implement it, or speculate about its implementation
* class NestedInteger {
* public:
* // Constructor initializes an empty nested list.
* NestedInteger();
*
* // Constructor initializes a single integer.
* NestedInteger(int value);
*
* // Return true if this NestedInteger holds a single integer, rather than a nested list.
* bool isInteger() const;
*
* // Return the single integer that this NestedInteger holds, if it holds a single integer
* // The result is undefined if this NestedInteger holds a nested list
* int getInteger() const;
*
* // Set this NestedInteger to hold a single integer.
* void setInteger(int value);
*
* // Set this NestedInteger to hold a nested list and adds a nested integer to it.
* void add(const NestedInteger &ni);
*
* // Return the nested list that this NestedInteger holds, if it holds a nested list
* // The result is undefined if this NestedInteger holds a single integer
* const vector<NestedInteger> &getList() const;
* };
*/
class Solution {
public:
NestedInteger deserialize(string s) {
stack<NestedInteger* > st;
if(s[0]!='[')
return NestedInteger(stoi(s));
int idx=0;
for(int i=0;s[i]!='\0';i++)
{
if(s[i]=='[')
{
st.push(new NestedInteger());
idx=i+1;
}
else if(s[i]==']'||s[i]==',')
{
if(idx!=i)
st.top()->add(NestedInteger(stoi(s.substr(idx,i-idx))));
if(s[i]==']')
{
NestedInteger* cur=st.top();
st.pop();
if(!st.empty())
st.top()->add(*cur);
else
st.push(cur);
}
idx=i+1;
}
}
return *st.top();
}
};
/*
"123"
"-11"
*/