首页 > 代码库 > 下压栈(LIFO) (能动态调整数组大小的实现)

下压栈(LIFO) (能动态调整数组大小的实现)

import java.util.*;

// 下压栈(LIFO) 能动态调整数组大小的实现
public class ResizeArrayStack<Item> implements Iterable<Item> {
	@SuppressWarnings("unchecked")
	private Item[] a=(Item[]) new Object[1];
	private int N;
	
	public boolean isEmpty() { return N==0; }
	public int size() { return N; }
	public void resize(int max){
		// 将栈中元素移动到大小为max的新数组中
		@SuppressWarnings("unchecked")
		Item[] temp=(Item[]) new Object[max];
		for(int i=0;i<N;i++){
			temp[i]=a[i];
		}
		a=temp;
	}
	
	public void push(Item item){
		if(N==a.length) {
			resize(2*a.length);
		}
		a[N++]=item;
	}
	public Item pop(){
		Item item=a[--N];
		// 将a[N]的值设为null 避免对象游离,及时回收内存
		a[N]=null;
		if(N>0 && N==(a.length/4)) resize(a.length/2);
		return item;
	}
	@Override
	public Iterator<Item> iterator() {
		return new ReverseArrayIterator();
	}
	// 逆序迭代遍历数组
	// Iterator类必须包含 hasNext() 和 next() 两个方法
	// 嵌套类可以访问包含它的类的实例变量 
	public class ReverseArrayIterator implements Iterator<Item>{
		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) {
		ResizeArrayStack<String> s=new ResizeArrayStack<String>();
		Scanner cin=new Scanner(System.in);
		System.out.println("Input a String end with $:");
		while(cin.hasNext()){
			String item=cin.next();
			if(item.equals("$")){
				break;
			}
			else {
				s.push(item);
			}
		}
		// foreach语句是while语句的一种简写方式
		System.out.println("display by for:");
		for(String str : s){
			System.out.print(str+" ");
		}
		System.out.println();
		// which
		System.out.println("display by which:");
		Iterator<String> it=s.iterator();
		while(it.hasNext()){
			String i=it.next();
			System.out.print(i+" ");
		}
	}
}
// Test example
Input a String end with $:
123 456 789 dut $
display by for:
dut 789 456 123 
display by which:
dut 789 456 123