<p>Given a string s represents the serialization of a nested list, implement a parser to deserialize it and return <em>the deserialized</em> <code>NestedInteger</code>.</p>

<p>Each element is either an integer or a list whose elements may also be integers or other lists.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;324&quot;
<strong>Output:</strong> 324
<strong>Explanation:</strong> You should return a NestedInteger object which contains a single integer 324.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;[123,[456,[789]]]&quot;
<strong>Output:</strong> [123,[456,[789]]]
<strong>Explanation:</strong> 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
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 5 * 10<sup>4</sup></code></li>
	<li><code>s</code> consists of digits, square brackets <code>&quot;[]&quot;</code>, negative sign <code>&#39;-&#39;</code>, and commas <code>&#39;,&#39;</code>.</li>
	<li><code>s</code> is the serialization of valid <code>NestedInteger</code>.</li>
	<li>All the values in the input are in the range <code>[-10<sup>6</sup>, 10<sup>6</sup>]</code>.</li>
</ul>

class Solution {
public:
    NestedInteger deserialize(string s) {
        if (s.empty()) return NestedInteger();

        // Si es solo un número (sin listas anidadas)
        if (s[0] != '[') {
            return NestedInteger(stoi(s));  // Es un solo entero
        }

        stack<NestedInteger> st;
        int num = 0;
        bool negative = false;

        for (int i = 0; i < s.size(); i++) {
            char c = s[i];

            if (c == '[') {
                // Nueva lista, la agregamos a la pila
                st.push(NestedInteger());
            } else if (c == ']') {
                // Si está cerrando una lista, extraemos el último NestedInteger de la pila
                NestedInteger ni = st.top();
                st.pop();

                if (!st.empty()) {
                    // Si no es el último, lo agregamos a la lista anterior
                    st.top().add(ni);
                } else {
                    // Si es el último, devolvemos esta lista
                    return ni;
                }
            } else if (c == ',') {
                // Ignoramos la coma, pero verificamos si hay un número pendiente por agregar
                continue;
            } else if (c == '-') {
                // Encontramos un número negativo
                negative = true;
            } else if (isdigit(c)) {
                // Procesamos un número (podría ser multi-dígito)
                int numStart = i;
                while (i < s.size() && isdigit(s[i])) i++;
                num = stoi(s.substr(numStart, i - numStart));
                if (negative) {
                    num = -num;
                    negative = false;
                }
                i--;  // Retrocedemos uno ya que hemos avanzado más de lo debido en el número

                // Agregamos el número al NestedInteger más reciente
                st.top().add(NestedInteger(num));
            }
        }

        return NestedInteger();
    }
};

16500