问题:一个可迭代的 Stack 用例,它含有一个静态的copy()
方法,接受一个字符串的栈作为参数并返回该栈的一个副本。
不多说,直接看代码实现。
import java.util.Iterator;
public class StackTest<T> implements Iterable<T>{
private Node head;
private int N;
private class Node{
private T item;
private Node next;
}
//判空
public boolean isEmpty() {
return head==null;
}
//计算栈的长度
public int size() {
return N;
}
//出栈,N要减一
public T pop() {
T item=head.item;
head=head.next;
N--;
return item;
}
//入栈,N要加一
public void push(T item) {
Node node=head;
head=new Node();
head.item=item;
head.next=node;
N++;
}
//迭代复制栈,加了迭代器在这里。
public static <T> StackTest<T> copy(StackTest<T> s) {
Iterator<T> it =s.iterator();
StackTest<T> result=new StackTest<T>();
StackTest<T> temp=new StackTest<T>();
while(it.hasNext()) {
temp.push(it.next());
}
it=temp.iterator();
while(it.hasNext()) {
result.push(it.next());
}
return result;
}
@Override
public Iterator<T> iterator() {
// TODO Auto-generated method stub
return new ListIterator();
}
//实现迭代功能,重载迭代器方法。
private class ListIterator implements Iterator<T>{
private Node current=head;
public boolean hasNext() {
// TODO Auto-generated method stub
return current!=null;
}
@Override
public T next() {
// TODO Auto-generated method stub
T item=current.item;
current=current.next;
return item;
}
}
}
测试代码如下
public class TestOne {
public static void main(String[] args) {
// TODO Auto-generated method stub
StackTest<String> str=new StackTest<String>();
str.push("1");
str.push("2");
str.push("3");
str.push("4");
str.push("5");
System.out.println(StackTest.copy(str));
StackTest<String> s=StackTest.copy(str);
while(!s.isEmpty()) {
System.out.print(s.pop());
System.out.println();
}
}
}
输出结果:
StackTest@1db9742
5
4
3
2
1