Design an iterator that supports the peek operation on an existing iterator in addition to the hasNext and the next operations.

Implement the PeekingIterator class:


	PeekingIterator(Iterator&lt;int&gt; nums) Initializes the object with the given integer iterator iterator.
	int next() Returns the next element in the array and moves the pointer to the next element.
	boolean hasNext() Returns true if there are still elements in the array.
	int peek() Returns the next element in the array without moving the pointer.


Note: Each language may have a different implementation of the constructor and Iterator, but they all support the int next() and boolean hasNext() functions.

&nbsp;
Example 1:

Input
["PeekingIterator", "next", "peek", "next", "next", "hasNext"]
[[[1, 2, 3]], [], [], [], [], []]
Output
[null, 1, 2, 2, 3, false]

Explanation
PeekingIterator peekingIterator = new PeekingIterator([1, 2, 3]); // [1,2,3]
peekingIterator.next();    // return 1, the pointer moves to the next element [1,2,3].
peekingIterator.peek();    // return 2, the pointer does not move [1,2,3].
peekingIterator.next();    // return 2, the pointer moves to the next element [1,2,3]
peekingIterator.next();    // return 3, the pointer moves to the next element [1,2,3]
peekingIterator.hasNext(); // return False


&nbsp;
Constraints:


	1 &lt;= nums.length &lt;= 1000
	1 &lt;= nums[i] &lt;= 1000
	All the calls to next and peek are valid.
	At most 1000 calls will be made to next, hasNext, and peek.


&nbsp;
Follow up: How would you extend your design to be generic and work with all types, not just integer?
class PeekingIterator:
  def __init__ (self,iterator):
    self.arr = iterator.v 
    self._next = 0 
    self.is_has_next = True 
  
  def next(self):
    val = self.arr[self._next] 
    self.next+=1 
    if self.next >= len(self.arr):
      self.is_has_next = False 
    return val 
  
  def hasNext(self):
    return self.is_has_next 
  
  def peek(self):
    return self.arr[self._next]
// Java Iterator interface reference:
// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

class PeekingIterator implements Iterator<Integer> {
    Queue<Integer> q;
	public PeekingIterator(Iterator<Integer> iterator) {
	    // initialize any member here.
	    q= new LinkedList<>();
        while(iterator.hasNext())
          q.add(iterator.next());  
	}
	
    // Returns the next element in the iteration without advancing the iterator.
	public Integer peek() {
        return q.peek();
	}
	
	// hasNext() and next() should behave the same as in the Iterator interface.
	// Override them if needed.
	@Override
	public Integer next() {
	    return q.remove();
	}
	
	@Override
	public boolean hasNext() {
	    return q.size()!=0;
	}
}
/*
 * Below is the interface for Iterator, which is already defined for you.
 * **DO NOT** modify the interface for Iterator.
 *
 * class Iterator {
 * struct Data;
 * Data* data;
 * public:
 * Iterator(const vector<int>& nums);
 * Iterator(const Iterator& iter);
 *
 * // Returns the next element in the iteration.
 * int next();
 *
 * // Returns true if the iteration has more elements.
 * bool hasNext() const;
 * };
 */

class PeekingIterator : public Iterator {
public:
    int _nextVal;
    bool _hasNext;
    PeekingIterator(const vector<int>& nums) : Iterator(nums) {
        // Initialize any member here.
        // **DO NOT** save a copy of nums and manipulate it directly.
        // You should only use the Iterator interface methods.
        _nextVal = 0;
        _hasNext = Iterator::hasNext();
        if (_hasNext)
            _nextVal = Iterator::next();
    }

    // Returns the next element in the iteration without advancing the iterator.
    int peek() {
        return (_nextVal);
    }

    // hasNext() and next() should behave the same as in the Iterator interface.
    // Override them if needed.
    int next() {
        int tmp = _nextVal;

        _hasNext = Iterator::hasNext();
        if (_hasNext)
            _nextVal = Iterator::next();
        return (tmp);
    }

    bool hasNext() const {
        return (_hasNext);
    }
};
var PeekingIterator = function(iterator) {
    this.iterator = iterator
    this.curr = iterator.next()

};

PeekingIterator.prototype.peek = function() {
    return this.curr
};

PeekingIterator.prototype.next = function() {
    let temp = this.curr
    this.curr = this.iterator.next()
    return temp
};

PeekingIterator.prototype.hasNext = function() {
    return this.curr > 0   // the input iterator return -100000000 when next() after it run out of members, instead of return undefined.
};
Peeking Iterator