【发布时间】: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<E>?是不是因为它的iterator()返回的元素不是按堆栈顺序? -
喜欢你的答案。但我指出我不想使用内置功能,我只是练习熟悉一些基本的 oop 功能
-
所以,最后我不明白你为什么选择this 作为答案?在这里你只需接受使用内置的 java
Stack! -
给一个答案,我会是你的;)
-
我的意思是 das_weezul's answer 更符合您所寻找的方向:实现您自己的堆栈迭代器的建议!
标签: java iterator arraylist stack