Реализация итератора для стека - PullRequest
0 голосов
/ 12 апреля 2011

Я определил интерфейс 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 () в качестве верхнего элемента.

Прав ли я с моей реализацией итератора, особенно со следующим методом?

Ответы [ 2 ]

3 голосов
/ 12 апреля 2011

Почему бы просто не использовать java.util.Stack<String>?

2 голосов
/ 12 апреля 2011

Я не знаю, является ли Итератор для стека хорошей идеей, так как типичное поведение стека не соответствует протоколу итератора, так как вам нужно будет вытолкнуть элемент, чтобы открыть следующий. Я бы предложил добавить публичный метод, такой как getList(), который возвращает представление списка в стеке. Затем список может реализовать интерфейс Iterator. Вы можете просто вернуть копию ArrayList следующим образом:

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