java - 为堆栈实现迭代器

标签 java iterator arraylist stack

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

我对迭代器的实现(尤其是下一个方法)是否正确?

最佳答案

我不知道堆栈的迭代器是否是一个好主意,因为堆栈的典型行为不符合迭代器协议(protocol),因为您必须弹出一个元素才能显示下一个元素。我建议添加一个公共(public)方法,如 getList() ,它返回堆栈的列表表示。然后列表可以实现 Iterator 接口(interface)。您可以像这样返回 ArrayList 的副本:

public List<String> returnList() {
  return new ArrayList<String>(list); // Return a copy of the ArrayList
}

关于java - 为堆栈实现迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5632600/

相关文章:

java - 在 JTable 中对 int 进行排序

Java HTMLUnit 测试导航按钮

c++ - 查看 STL 容器中的下一个元素

java - 将文本文件行中的字符串标记输入数组,然后作为数组集合输出

java - 尝试在空对象引用上调用虚拟方法“boolean java.util.ArrayList.add”

java - 对ECC公钥的长度感到困惑

Java Flat 多项目,具有快速增量编译和热代码部署 - WTP? eclipse ?主意?马文? Gradle ?

c++ - 将 std::find() 与反向迭代器一起使用

c++ - 将 std::pair 迭代器转换为 boost::iterator_range

Java:如何在创建对象时用类的对象初始化数组?