import java.util.*;
import java.lang.*;
import java.io.*;
class GenericQueue<Item> implements Iterable<Item> {
private Node first, last;
private class Node {
Item item;
Node next;
}
public boolean isEmpty() {
return first == null;
}
public void enqueue(Item item) {
Node oldLast = last;
last = new Node();
last.item = item;
last.next = null;
if (isEmpty()) first = last;
else oldLast.next = last;
}
public Item dequeue() {
Item item = first.item;
first = first.next;
if (isEmpty()) last = null;
return item;
}
@Override
public Iterator<Item> iterator() {
return new LinkedIterator();
}
private class LinkedIterator implements Iterator<Item> {
private Node current = first;
public boolean hasNext() {
return current != null;
}
public Item next() {
Item item = current.item;
current = current.next;
return item;
}
}
}
public class Main {
GenericQueue<String> strQ = new GenericQueue<>();
strQ.enqueue("Cat");
strQ.enqueue("Dog");
System.
out.
println("Iterating:");
System.
out.
println("Dequeuing:"); System.
out.
println(strQ.
dequeue()); System.
out.
println(strQ.
dequeue()); }
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBHZW5lcmljUXVldWU8SXRlbT4gaW1wbGVtZW50cyBJdGVyYWJsZTxJdGVtPiB7Cglwcml2YXRlIE5vZGUgZmlyc3QsIGxhc3Q7CgoJcHJpdmF0ZSBjbGFzcyBOb2RlIHsKCQlJdGVtIGl0ZW07CgkJTm9kZSBuZXh0OwoJfQoKCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CgkJcmV0dXJuIGZpcnN0ID09IG51bGw7Cgl9CgoJcHVibGljIHZvaWQgZW5xdWV1ZShJdGVtIGl0ZW0pIHsKCQlOb2RlIG9sZExhc3QgPSBsYXN0OwoJCWxhc3QgPSBuZXcgTm9kZSgpOwoJCWxhc3QuaXRlbSA9IGl0ZW07CgkJbGFzdC5uZXh0ID0gbnVsbDsKCQlpZiAoaXNFbXB0eSgpKSBmaXJzdCA9IGxhc3Q7CgkJZWxzZSBvbGRMYXN0Lm5leHQgPSBsYXN0OwoJfQoKCXB1YmxpYyBJdGVtIGRlcXVldWUoKSB7CgkJSXRlbSBpdGVtID0gZmlyc3QuaXRlbTsKCQlmaXJzdCA9IGZpcnN0Lm5leHQ7CgkJaWYgKGlzRW1wdHkoKSkgbGFzdCA9IG51bGw7CgkJcmV0dXJuIGl0ZW07Cgl9CgoJQE92ZXJyaWRlCglwdWJsaWMgSXRlcmF0b3I8SXRlbT4gaXRlcmF0b3IoKSB7CgkJcmV0dXJuIG5ldyBMaW5rZWRJdGVyYXRvcigpOwoJfQoKCXByaXZhdGUgY2xhc3MgTGlua2VkSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxJdGVtPiB7CgkJcHJpdmF0ZSBOb2RlIGN1cnJlbnQgPSBmaXJzdDsKCgkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKCQkJcmV0dXJuIGN1cnJlbnQgIT0gbnVsbDsKCQl9CgoJCXB1YmxpYyBJdGVtIG5leHQoKSB7CgkJCWlmICghaGFzTmV4dCgpKSB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwoJCQlJdGVtIGl0ZW0gPSBjdXJyZW50Lml0ZW07CgkJCWN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CgkJCXJldHVybiBpdGVtOwoJCX0KCX0KfQoKcHVibGljIGNsYXNzIE1haW4gewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCUdlbmVyaWNRdWV1ZTxTdHJpbmc+IHN0clEgPSBuZXcgR2VuZXJpY1F1ZXVlPD4oKTsKCQlzdHJRLmVucXVldWUoIkNhdCIpOwoJCXN0clEuZW5xdWV1ZSgiRG9nIik7CgoJCVN5c3RlbS5vdXQucHJpbnRsbigiSXRlcmF0aW5nOiIpOwoJCWZvciAoU3RyaW5nIHMgOiBzdHJRKSBTeXN0ZW0ub3V0LnByaW50bG4ocyk7CgoJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVxdWV1aW5nOiIpOwoJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJRLmRlcXVldWUoKSk7CgkJU3lzdGVtLm91dC5wcmludGxuKHN0clEuZGVxdWV1ZSgpKTsKCX0KfQo=