import edu.princeton.cs.algs4.StdOut; import edu.princeton.cs.algs4.Queue; import java.util.Iterator; public class Example4Solved { // Complete this class private class PeekingIterator implements Iterator { // Instance variables private Iterator original_iterator; private T buffer; public PeekingIterator(Iterator it) { original_iterator = it; buffer = null; } public boolean hasNext() { // we have a next element in two situations // - either there is an element in the buffer // - or the iterator hasNext is true return (buffer != null) || (original_iterator.hasNext()); } public T next() { T result; if (buffer != null) { // we have an element in the buffer result = buffer; buffer = null; // make sure to set to null so // we don't revisit this item } else { // we do not have an element in the buffer result = original_iterator.next(); } return result; } public T peek() { // if no element is buffered, then try to fill the buffer if (buffer == null) buffer = original_iterator.next(); // now that we have guaranteed buffer is not empty, return contents return buffer; } public void remove() { throw new RuntimeException("not implemented"); } } public static void main(String[] args) { Queue q = new Queue(); q.enqueue("hello"); q.enqueue("world"); q.enqueue("!"); // Two ways of iterating over the objects of q. Iterator iterator = new PeekingIterator(q.iterator()); StdOut.println(iterator); StdOut.println(iterator.hasNext()); StdOut.println(iterator.next()); StdOut.println(iterator.peek()); StdOut.println(iterator.peek()); StdOut.println(iterator.hasNext()); StdOut.println(iterator.next()); } }