/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class GenericResizingStack<Item> implements Iterable<Item> {
private Item[] s;
private int n = 0;
public GenericResizingStack (int capacity) {
// @#$*! generic array creation: s = new Item[capacity]; not allowed!
s
= (Item
[]) new Object[capacity
]; // So ugly cast needed }
public void push (Item item) {
if (n == s.length) resize (2 * s.length);
s [n++] = item;
}
public Item pop() {
Item item = s[--n];
s[n] = null;
if (n > 0 && n == s.length/4) resize(s.length/2);
return item;
}
private void resize(int capacity) {
Item
[] copy
= (Item
[]) new Object[capacity
]; for (int i = 0; i < n; i++) copy[i] = s[i];
s = copy;
}
public Iterator<Item> iterator() {
return new ReverseArrayIterator(); // Reverse to print in order of popping
}
private class ReverseArrayIterator implements Iterator<Item> {
private int i = n-1;
public boolean hasNext() {
return i >=0;
}
public Item next() {
return s[i--];
}
}
}
/* Name of the class has to be "Main" only if the class is public. */
public class Main
{
{
GenericResizingStack<String> strStack = new GenericResizingStack<String>(1);
strStack.push("Cat");
strStack.push("Dog");
System.
out.
println("Iterating:");
System.
out.
println("Popping:"); System.
out.
println(strStack.
pop()); System.
out.
println(strStack.
pop()); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBHZW5lcmljUmVzaXppbmdTdGFjazxJdGVtPiBpbXBsZW1lbnRzIEl0ZXJhYmxlPEl0ZW0+IHsKCXByaXZhdGUgSXRlbVtdIHM7Cglwcml2YXRlIGludCBuID0gMDsKCQoJcHVibGljIEdlbmVyaWNSZXNpemluZ1N0YWNrIChpbnQgY2FwYWNpdHkpIHsKCQkvLyBAIyQqISBnZW5lcmljIGFycmF5IGNyZWF0aW9uOiBzID0gbmV3IEl0ZW1bY2FwYWNpdHldOyBub3QgYWxsb3dlZCEKCQlzID0gKEl0ZW1bXSkgbmV3IE9iamVjdFtjYXBhY2l0eV07IC8vIFNvIHVnbHkgY2FzdCBuZWVkZWQKCX0KCQoJcHVibGljIHZvaWQgcHVzaCAoSXRlbSBpdGVtKSB7CgkJaWYgKG4gPT0gcy5sZW5ndGgpIHJlc2l6ZSAoMiAqIHMubGVuZ3RoKTsgCgkJcyBbbisrXSA9IGl0ZW07Cgl9CgkKCXB1YmxpYyBJdGVtIHBvcCgpIHsKCQlJdGVtIGl0ZW0gPSBzWy0tbl07CgkJc1tuXSA9IG51bGw7CgkJaWYgKG4gPiAwICYmIG4gPT0gcy5sZW5ndGgvNCkgcmVzaXplKHMubGVuZ3RoLzIpOwoJCXJldHVybiBpdGVtOwoJfQoJCglwcml2YXRlIHZvaWQgcmVzaXplKGludCBjYXBhY2l0eSkgeyAKCQlJdGVtW10gY29weSA9IChJdGVtW10pIG5ldyBPYmplY3RbY2FwYWNpdHldOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBjb3B5W2ldID0gc1tpXTsKCQlzID0gY29weTsKCX0KCQoJcHVibGljIEl0ZXJhdG9yPEl0ZW0+IGl0ZXJhdG9yKCkgewoJCXJldHVybiBuZXcgUmV2ZXJzZUFycmF5SXRlcmF0b3IoKTsgLy8gUmV2ZXJzZSB0byBwcmludCBpbiBvcmRlciBvZiBwb3BwaW5nCgl9CgkKCXByaXZhdGUgY2xhc3MgUmV2ZXJzZUFycmF5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxJdGVtPiB7CgkJcHJpdmF0ZSBpbnQgaSA9IG4tMTsKCQkKCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewoJCQlyZXR1cm4gaSA+PTA7CgkJfQoJCQoJCXB1YmxpYyBJdGVtIG5leHQoKSB7CgkJCWlmICghaGFzTmV4dCAoKSkgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKCQkJcmV0dXJuIHNbaS0tXTsKCQl9Cgl9Cn0KCgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KcHVibGljIGNsYXNzIE1haW4KewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJR2VuZXJpY1Jlc2l6aW5nU3RhY2s8U3RyaW5nPiBzdHJTdGFjayA9IG5ldyBHZW5lcmljUmVzaXppbmdTdGFjazxTdHJpbmc+KDEpOwoJCXN0clN0YWNrLnB1c2goIkNhdCIpOwoJCXN0clN0YWNrLnB1c2goIkRvZyIpOwogCgkJU3lzdGVtLm91dC5wcmludGxuKCJJdGVyYXRpbmc6Iik7CgkJZm9yIChTdHJpbmcgcyA6IHN0clN0YWNrKSBTeXN0ZW0ub3V0LnByaW50bG4ocyk7CiAKCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBvcHBpbmc6Iik7CgkJU3lzdGVtLm91dC5wcmludGxuKHN0clN0YWNrLnBvcCgpKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyU3RhY2sucG9wKCkpOwoJfQp9