Я определил интерфейс 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. Поэтому я решил реализовать внутренний класс и расширить свой SimpleStack с помощью интерфейса Iterable .
Итак, у меня сейчас:
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 () в качестве верхнего элемента.
Прав ли я с моей реализацией итератора, особенно со следующим методом?