package org.loda.structure;
import java.util.Iterator;
/**
*
* @ClassName: Stack
* @Description: 自定义栈
* @author minjun
* @date 2015年5月15日 下午5:22:37
*
* @param <Item>
*/
public class Stack<Item> implements Iterable<Item> {
//数组作为基本存储结构
private Item[] items;
//栈大小
private int size;
//默认容量
private int capacity=0;
public Stack(){
this(10);
}
@SuppressWarnings("unchecked")
public Stack(int capacity){
this.capacity=capacity;
items=(Item[]) new Object[capacity];
}
//压栈
public void push(Item item){
if(size==items.length)
resize();
items[size++]=item;
}
//出栈
public Item pop(){
if(size==0)
throw new RuntimeException("栈容器已经见底了...");
return items[--size];
}
//栈大小
public int size(){
return size;
}
//是否为空栈
public boolean isEmpty(){
return size()==0;
}
//两倍扩容数组
@SuppressWarnings("unchecked")
private void resize() {
this.capacity=this.size<<1;
Item[] newItems=(Item[]) new Object[capacity];
for(int i=0;i<items.length;i++){
newItems[i]=items[i];
}
items=newItems;
}
@Override
public Iterator<Item> iterator() {
return new StackIterator();
}
/**
*
* @ClassName: StackIterator
* @Description: 栈内部迭代器
* @author minjun
* @date 2015年5月15日 下午5:23:48
*
*/
private class StackIterator implements Iterator<Item>{
//拷贝一份size变量,用来保证以后size变量依然可以重用
private int innerSize=size;
@Override
public boolean hasNext() {
return innerSize>0;
}
@Override
public Item next() {
return items[--innerSize];
}
@Override
public void remove() {
throw new RuntimeException("目前不支持该方法");
}
}
public static void main(String[] args) {
Stack<String> stack=new Stack<String>();
for(int i=0;i<20;i++){
stack.push((char)(i+65)+"bbbb");
}
//下面进行两次迭代测试,目的是确认该stack的迭代器可以复用
for(String s:stack){
System.out.println(s);
}
System.out.println("-----------------");
for(String s:stack){
System.out.println(s);
}
}
}