Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为堆栈实现迭代器_Java_Iterator_Arraylist_Stack - Fatal编程技术网

Java 为堆栈实现迭代器

Java 为堆栈实现迭代器,java,iterator,arraylist,stack,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. ele

我定义了一个接口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;
        }
}
公共类SimpleStack实现StringStack{
private ArrayList list=new ArrayList();
公共无效推送(字符串值){
列表。添加(值);
}
公共字符串pop(){
如果(!list.isEmpty()){
返回list.remove(list.size()-1);
}否则{
返回null;
}
}
公共字符串peek(){
如果(!list.isEmpty()){
返回list.get(list.size()-1);
}否则{
返回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();
    }
 }
公共类SimpleStack实现StringStack,Iterable
...
公共迭代器迭代器(){
返回新的StackEnum();
}
类StackEnum实现迭代器{
int pos=list.size();
公共布尔hasNext(){
返回位置!=0;
}
公共字符串next(){
如果(位置!=0){
String str=list.get(pos);
pos--;
}否则{
抛出新的NoTouchElementException();
}
}
公共空间删除(){
抛出新的UnsupportedOperationException();
}
}
我完全不知道如何在迭代器中执行迭代。因为我的堆栈由数组列表表示,所以我使用list.size()作为顶部元素


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

为什么不直接使用
java.util.Stack

为什么不直接使用
java.util.Stack

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

public List<String> returnList() {
  return new ArrayList<String>(list); // Return a copy of the ArrayList
}
公共列表返回列表(){
返回新的ArrayList(list);//返回ArrayList的副本
}

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

public List<String> returnList() {
  return new ArrayList<String>(list); // Return a copy of the ArrayList
}
公共列表返回列表(){
返回新的ArrayList(list);//返回ArrayList的副本
}

我想OP只是想锻炼他/她的Java技能;)我说我不想要内置的东西,我想写我自己的迭代器。对不起,我没有看到。我以为这只是关于
ArrayList.iterator()
。不过,你可以扩展
堆栈
并覆盖
迭代器()
,我猜…我想OP只是想锻炼他/她的Java技能;)我说我不想要内置的东西,我想写我自己的迭代器。很抱歉,我没有看到。我以为这只是关于
ArrayList.iterator()
。不过,你可以扩展
堆栈
并覆盖
迭代器()
,我想…实现在我看来还行。只有一个问题:为什么不使用?是因为它的
迭代器()
返回的元素不是按堆栈顺序排列的?你也很喜欢这些答案。但是我指出我不想使用内置功能,我只是练习熟悉一些基本的oop功能。最后,我不明白你为什么选择作为答案?在这里,你只需接受使用内置java
堆栈
!给出一个答案,我会的您的;)我的意思是,它更符合您所寻求的方向:实现您自己的堆栈迭代器的建议!我认为实现看起来不错。只有一个问题:为什么不使用它?是因为它的
iterator()
返回的元素不是按堆栈顺序排列的?你也很喜欢这些答案。但是我指出我不想使用内置功能,我只是练习熟悉一些基本的oop功能。最后,我不明白你为什么选择作为答案?在这里,你只需接受使用内置java
堆栈
!给出一个答案,我会的您的;)我的意思是,它更符合您所寻求的方向:实现自己的堆栈迭代器的建议!