为堆栈实现迭代器

时间:2011-04-12 08:48:19

标签: java iterator arraylist stack

我定义了一个接口 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()作为顶级元素。

我是否正确执行迭代器,特别是下一个方法?

2 个答案:

答案 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
}