题目与示例
题目
题目内容
给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。
列表中的每个元素只可能是整数或整数嵌套列表
来源:力扣(LeetCode)
示例 1:
输入:s = “324”,
输出:324
解释:你应该返回一个 NestedInteger 对象,其中只包含整数值 324。
示例 2:
输入:s = “[123,[456,[789]]]”,
输出:[123,[456,[789]]]
解释:返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表:
- 一个 integer 包含值 123
- 一个包含两个元素的嵌套列表:
i. 一个 integer 包含值 456
ii. 一个包含一个元素的嵌套列表
a. 一个 integer 包含值 789
一、思路
对于整个列表有两种情况.
第一种情况是:列表中只有一个元素,是一个整数,这时候s[0]不为‘[’,我们只需要直接返回这个整数即可;
第二种情况是:列表中是整数嵌套列表,我们使用栈来解决这个问题.
对于嵌套列表中的元素,有4种情况,如果s[i]为’[‘,说明会有一个新被嵌套的数、如果s[i]为’-‘,说明这个数是负数,将flag设为-1、如果是s[i]为’,‘或’]',说明这个被嵌套的数已经读取完了、如果是一个数字,说明正在读取这个数字的元素,我们进行分类讨论.
每当我们读取完一个整数,就将NestedInteger实例向栈中压入,这样来实现嵌套,最后我们只需要返回栈S的栈顶元素即可。
二、解题代码
解题代码如下:
class Solution {
public:
NestedInteger deserialize(string s) {
if(s[0] != '['){
return NestedInteger(stoi(s));
}//如果s[0]不是'[',说明NestedInteger中就是一个数,直接返回这个数即可
stack<NestedInteger> S;
int num = 0 , flag = 1;//flag用于标识NestedInteger里的数是正还是负
for(int i = 0; i < s.size(); i++) {
if(s[i] == '[')//如果s[i]为'[',说明会有一个新被嵌套的数
S.push(NestedInteger());//使用构造函数新建一个NestedInteger实例压入栈中
else if(s[i] == '-')//如果s[i]为'-',说明这个数是负数,将flag设为-1
flag = -1;
else if(isdigit(s[i]))//isdigit()函数可以判断s[i]是不是一个十进制的数
num = s[i] - '0' + 10 * num;//计算被嵌套的数字num
else if(s[i] == ',' || s[i] == ']') {//如果是s[i]为','或']',说明这个被嵌套的数已经读取完了
if(isdigit(s[i-1])) {//如果前面确实有一个数
num *= flag;//计算num的值
S.top().add(NestedInteger(num));//创建一个值为num的NestedInteger实例并让栈顶元素add
}
flag = 1;
num = 0;//重置flag和num
if(s[i]==']' && S.size()>1) {
NestedInteger NeI = S.top();
S.pop();
S.top().add(NeI);
}
}
}
return S.top();
}
};
/**
* // 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;
* };
*/
注:以上部分内容源自力扣,解题方法为个人想法,如有错误还请大家指正