您的位置:首页 > 其它

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

2014-05-10 15:08 281 查看
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
的值设为null 避免对象游离,及时回收内存
a
=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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: