import java.util.Arrays; import java.util.Iterator; import java.util.NoSuchElementException; /** * array * generics * resizing * loitering * iteration * <p> * void push(Item item) * Item pop() * boolean isEmpty() * int size() */ public class ArrayStack<Item> implements Iterable { private int N; private Item[] a = (Item[]) new Object[1]; public static void main(String[] args) { ArrayStack<String> stack = new ArrayStack<>(); stack.push("to"); System.out.println(stack.toString()); stack.push("be"); System.out.println(stack.toString()); stack.push("or"); System.out.println(stack.toString()); stack.push("not"); System.out.println(stack.toString()); stack.push("to"); System.out.println(stack.toString()); stack.pop(); System.out.println(stack.toString()); stack.push("be"); System.out.println(stack.toString()); stack.pop(); System.out.println(stack.toString()); stack.pop(); System.out.println(stack.toString()); stack.push("that"); System.out.println(stack.toString()); stack.push("is"); System.out.println(stack.toString()); stack.pop(); System.out.println(stack.toString()); stack.pop(); System.out.println(stack.toString()); stack.pop(); System.out.println(stack.toString()); stack.pop(); System.out.println(stack.toString()); stack.pop(); System.out.println(stack.toString()); stack.pop(); System.out.println(stack.toString()); } public void push(Item i) { if (N == a.length) { resize(2 * a.length); } a[N++] = i; } public Item pop() { if (isEmpty()) { throw new NoSuchElementException(); } Item i = a[--N]; a[N] = null; if (N > 0 && N == a.length / 4) { resize(a.length / 2); } return i; } public boolean isEmpty() { return N == 0; } public int size() { return N; } private void resize(int max) { Item[] temp = (Item[]) new Object[max]; for (int i = 0; i < N; i++) { temp[i] = a[i]; } a = temp; } @Override public Iterator iterator() { return new ReverseStackIterator(); } @Override public String toString() { return "ArrayStack{" + "a=" + Arrays.toString(a) + ", N=" + N + '}'; } private class ReverseStackIterator implements Iterator { private int i = N; @Override public boolean hasNext() { return i > 0; } @Override public Object next() { return a[--i]; } } }