/** * // This is the interface that allows for creating nested lists. * // You should not implement it, or speculate about its implementation * class NestedInteger { * public: * // 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; * * // 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 NestedIterator { public: stack<pair<vector<NestedInteger>::iterator, vector<NestedInteger>::iterator>> s; NestedIterator(vector<NestedInteger> &nestedList) { if (nestedList.size() > 0) s.push({nestedList.begin(), nestedList.end()}); hasNext(); } int next() { int res = s.top().first->getInteger(); s.top().first++; return res; } bool hasNext() { while (!s.empty()) { auto p = s.top(); vector<NestedInteger>::iterator cur = p.first; vector<NestedInteger>::iterator end = p.second; if (cur == end) { s.pop(); if (!s.empty()) { s.top().first++; } } else if (cur->isInteger()) return true; else { s.push({cur->getList().begin(), cur->getList().end()}); } } return false; } }; /** * Your NestedIterator object will be instantiated and called as such: * NestedIterator i(nestedList); * while (i.hasNext()) cout << i.next(); */