/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package exemplopilha;

import java.util.ArrayList;

/**
 *
 * @author 42071420684
 */
public class PilhaDelegada<T> implements IPilha<T>,
        IPilhaIterator<T> {

  private ArrayList<T> vet_;
  private int top_ = 0;          // top aponta para primeira posicao livre
  private int cursor_;           // aponta para primeiro elemento da iteracao  

  //------------------------------------------------------------
  // Construtores
  //------------------------------------------------------------
  public PilhaDelegada(int initiaCapacity) {
    this.vet_ = new ArrayList<T>(initiaCapacity);
  }

  public PilhaDelegada() {
    this.vet_ = new ArrayList<T>();
  }

  //------------------------------------------------------------
  // Iterface IPilha
  //------------------------------------------------------------
  public boolean vazia() {
    return top_ == 0;
  }

  public T top() throws PilhaException {
    if (vazia()) {
      throw new PilhaException("Pilha vazia: tentativa de obter o topo");
    } else {
      return vet_.get(top_ - 1);
    }
  }

  public T pop() throws PilhaException {
    if (vazia()) {
      throw new PilhaException("Pilha vazia: tentativa de desempilhar");
    } else {
      return vet_.get(--top_);
    }
  }

  public void push(T val) throws PilhaException {
    vet_.add(top_++, val);
  }

  public IPilhaIterator<T> iterador() {
    return this;
  }

  //------------------------------------------------------------
  // Iterface IPilhaIterator
  //------------------------------------------------------------
  public T current() {
    return vet_.get(cursor_);
  }

  // Forward iteration .....
  public void begin() {
    cursor_ = top_ - 1;
  }
  public boolean hasNext() {
    if (cursor_ >= 0) {
      return true;
    } else {
      return false;
    }
  }
  public T next() {
    return vet_.get(cursor_--);
  }

  // Backward iteration .....
  public void last() {
    cursor_ = 0;
  }
  public boolean hasPrevious() {
    if ( cursor_ < top_) {
      return true;
    } else {
      return false;
    }
  }
  public T previous() {
    return vet_.get(cursor_++);
  }

}
