原题链接:385. 迷你语法分析器
solution:
利用深度优先搜索
/**
* // 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) {
int u = 0;
return dfs(s,u);
}
NestedInteger dfs(string &s, int &u){
NestedInteger res; //定义返回值
if(s[u] == '['){ //遇到内部节点
u++; //跳过当前左括号
while(s[u] != ']'){
res.add(dfs(s,u)); //没有遇到左括号就dfs遍历
}
u++; //跳过右括号
if (u < s.size() && s[u] == ',') // 如果当前字符是,那么跳过都好
u++; // 跳过逗号
}
else{ //处理其他情况
int k = u;
while(k < s.size() && s[k] != ',' && s[k] != ']') k++; //将数字全部跳过
res.setInteger(stoi(s.substr(u, k - u))); //将数字存入
if(k < s.size() && s[k] == ',') k++; //跳过逗号
u = k;
}
return res;
}
};
堆栈
class Solution {
public:
NestedInteger deserialize(string s) {
if(s[0] != '[') return NestedInteger(stoi(s));
int n = s.size();
stack<NestedInteger> st; //定义堆栈
NestedInteger res; //定义返回值
string num;//定义字符串
for(int i = 0;i < n;i++){
if(s[i] == '['){
st.emplace(NestedInteger());
}
else if(s[i] == '-' || isdigit(s[i])){
num += s[i];
}
else if(s[i] == ','){
if(num.empty()) continue;
st.top().add(stoi(num));
num.clear();
}
else if(s[i] == ']'){
res = st.top();
st.pop();
if(!num.empty()){res.add(stoi(num));num.clear();}
if(!st.empty())st.top().add(res);
}
}
return res;
}
};