package com.arithmetic;import java.util.Iterator;
import java.util.NoSuchElementException;// 能够动态调整数组大小的实现
public class ResizingArrayStack<Item> implements Iteratable<Item> {private Item[] a; // 栈元素private int N;ResizingArrayStack(int cap) {a = (Item[]) new Object[cap];N = 0;}// 新增时检查数组大小,如果栈的大小和数组大小一致,那么将原来数组长度加倍void push(Item item) {if (N == a.length) {resize(2 * a.length);}a[N++] = item;}// 删除栈顶元素,如果数组较大,可以将其长度减半Item pop() {if (isEmpty()) throw new NoSuchElementException("Stack underflow");Item item = a[N - 1];a[N - 1] = null; // to avoid loiteringN--;// shrink size of array if necessaryif (N > 0 && N == a.length / 4) resize(a.length / 2);return item;}int size() {return N;}boolean isEmpty() {return N == 0;}// 实现一个方法,将栈移动到另外一个大小不同的数组中private void resize(int max) {Item[] temp = (Item[]) new Object[max];for (int i = 0; i < N; i++) {temp[i] = a[i];}a = temp;}@Overridepublic Iterator<Item> iterator() {return new ReverseArrayIterator();}private class ReverseArrayIterator implements Iterator<Item> {private int i;public ReverseArrayIterator() {i = N - 1;}@Overridepublic boolean hasNext() {return i >= 0;}@Overridepublic Item next() {if (!hasNext()) throw new NoSuchElementException();return a[i--];}@Overridepublic void remove() {throw new UnsupportedOperationException();}}public static void main(String[] args) {ResizingArrayStack stack = new ResizingArrayStack<>(100);stack.push(1);stack.push(2);stack.push(3);Iterator it = stack.iterator();while (it.hasNext()) {System.out.println("Iterator : " + it.next());}}
}