341. Flatten Nested List Iterator

/**
 * // 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();
 */
原文地址:https://www.cnblogs.com/JTechRoad/p/9088468.html