我定义了一个接口 StringStack
public interface StringStack{
//add a value to the stack
public void push(String value);
//fetch top-most element of the stack. element is removed
public String pop();
//fetch top-most element of the stack. element is not removed
public String peek();
}
此外,我定义了一个 SimpleStack 类,它使用 ArrayList 来管理堆栈
public class SimpleStack implements StringStack{
private ArrayList<String> list = new ArrayList<String>();
public void push(String value){
list.add(value);
}
public String pop(){
if(!list.isEmpty()){
return list.remove(list.size() - 1);
}else{
return null;
}
}
public String peek(){
if(!list.isEmpty()){
return list.get(list.size() - 1);
}else{
return null;
}
}
现在我想为我的堆栈类定义一个迭代器,但我不想使用内置的ArrayList迭代器。所以我开始实现一个内部类并使用 Iterable 接口扩展我的SimpleStack。
所以我现在有:
public class SimpleStack implements StringStack, Iterable<String>
...
public Iterator<String> iterator(){
return new StackEnum();
}
class StackEnum implements Iterator<String>{
int pos = list.size();
public boolean hasNext(){
return pos != 0;
}
public String next(){
if(pos != 0){
String str = list.get(pos);
pos--;
}else{
throw new NoSuchElementException();
}
}
public void remove(){
throw new UnsupportedOperationException();
}
}
我完全不确定如何在迭代器中执行迭代。由于我的堆栈由数组列表表示,因此我使用list.size()作为顶级元素。
我是否正确执行迭代器,特别是下一个方法?
答案 0 :(得分:3)
为什么不使用java.util.Stack<String>
?
答案 1 :(得分:2)
我不知道堆栈的迭代器是否是一个好主意,因为堆栈的典型行为不符合迭代器协议,因为你必须弹出一个元素来揭示下一个。我建议添加一个像getList()
这样的公共方法,它返回堆栈的列表表示。然后该列表可以实现Iterator接口。您可以像这样返回ArrayList的副本:
public List<String> returnList() {
return new ArrayList<String>(list); // Return a copy of the ArrayList
}