package com.ziqin.stack;
import java.util.Iterator;
/**
* @author Leiziqin
* @since 2017/11/25
*/
public class ResizingArrayStack implements Iterable {
/**
* 元素数组
*/
@SuppressWarnings("unchecked")
private Item[] a = (Item[]) new Object[1];
/**
* 元素数量
*/
private int n = 0;
/**
* 栈是否为空
*
* @return 栈是否为空
*/
public boolean isEmpty() {
return n == 0;
}
/**
* 栈的大小
*
* @return 栈大小
*/
public int size() {
return n;
}
/**
* 将栈移动到一个大小为max的新数组
*
* @param max 新数组大小
*/
@SuppressWarnings("unchecked")
private void resize(int max) {
Item[] temp = (Item[]) new Object[max];
for (int i = 0; i < n; i++) {
temp[i] = a[i];
}
a = temp;
}
/**
* 将元素添加到栈顶
*
* @param item 元素
*/
public void push(Item item) {
if (n == a.length) {
resize(2 * a.length);
}
a[n++] = item;
}
/**
* 从栈顶删除元素
*
* @return 栈顶元素
*/
public Item pop() {
Item item = a[--n];
a[n] = null;
if (n > 0 && n == a.length / 4) {
resize(a.length / 2);
}
return item;
}
@Override
public Iterator iterator() {
return new ReverseArrayIterator();
}
/**
* 为了支持foreach
*/
private class ReverseArrayIterator implements Iterator {
private int i = n;
@Override
public boolean hasNext() {
return i > 0;
}
@Override
public Item next() {
return a[--i];
}
@Override
public void remove() {
}
}
public static void main(String[] args) {
ResizingArrayStack stack = new ResizingArrayStack<>();
stack.push("Hello");
stack.push("World");
stack.push("Java");
for (String s : stack) {
System.out.println(s);
}
String pop = stack.pop();
System.out.println(pop);
stack.forEach(System.out::println);
}
}