C++ Clean and Elegant Code with Clear logic
class Solution {
NestedInteger parse(const string &s, int & pos)
{
if (s[pos] == '[')
return parseList(s, pos);
return parseNum(s, pos);
}
NestedInteger parseNum(const string &s, int & pos)
{
int num = 0;
int sign = s[pos] == '-' ? -1 : 1;
if (s[pos] == '-' || s[pos] == '+')
pos ++;
for (;pos < s.size() && isdigit(s[pos]); pos ++)
num = num * 10 + s[pos] - '0';
return NestedInteger(sign * num);
}
NestedInteger parseList(const string &s, int &pos)
{
NestedInteger ni;
while (s[pos] != ']')
{
pos ++; //skip [ or ,
if (s[pos] == ']') break; //handle [] or [1,2,]
ni.add(parse(s, pos));
}
pos ++; // skip ]
return ni;
}
public:
NestedInteger deserialize(const string &s) {
int pos = 0;//pos ALWAYS points to 1 position past the last parsed string;
//This is an invariance maintained across the entire program.
return parse(s, pos);
}
};
stack 版本
class Solution {
public:
NestedInteger deserialize(string s) {
int i = 0;
if (isdigit(s[i]) || s[i] == '-')
return NestedInteger(stoi(s));
++i;
NestedInteger list;
while (s[i] != ']') {
list.add(deserialize(s.substr(i, s.size() - i)));
if(isdigit(s[i]) || s[i] == '-') {
while(isdigit(s[i]) || s[i] == '-')
++i;
}else {
i += num.top();
num.pop();
}
if (s[i] == ',')
++i;
}
++i;
num.push(i);
return list;
}
private:
stack<int> num;
};
以及牛b的istringstream
http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html
详解
class Solution {
public:
NestedInteger deserialize(string s) {
istringstream in(s);
return deserialize1(in);
}
private:
NestedInteger deserialize1(istringstream &in) {
int number;
if (in >> number)
return NestedInteger(number);
in.clear();
in.get();
NestedInteger list;
while (in.peek() != ']') {
list.add(deserialize1(in));
if (in.peek() == ',')
in.get();
}
in.get();
return list;
}
};