【问题标题】:Implementing an iterator for a stack为堆栈实现迭代器
【发布时间】:2011-08-03 16:57:48
【问题描述】:

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

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

【问题讨论】:

  • 实施对我来说看起来不错。只有一个问题:你为什么不使用java.util.Stack&lt;E&gt;?是不是因为它的iterator() 返回的元素不是按堆栈顺序?
  • 喜欢你的答案。但我指出我不想使用内置功能,我只是练习熟悉一些基本的 oop 功能
  • 所以,最后我不明白你为什么选择this 作为答案?在这里你只需接受使用内置的 java Stack!
  • 给一个答案,我会是你的;)
  • 我的意思是 das_weezul's answer 更符合您所寻找的方向:实现您自己的堆栈迭代器的建议!

标签: java iterator arraylist stack


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-28
    • 2022-10-06
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2013-01-25
    相关资源
    最近更新 更多