/* classe Coda implementata con Lista semplice di valori interi
   Si inseriscono i nodi DALLA CODA della lista e si prelevano DALLA TESTA della lista.
   Il meccanismo è il seguente:
     EnQueque() -> inserisce un nodo in CODA alla lista
     DeQueque() -> elimina un nodo dalla TESTA della lista
     Clear()   -> elimina tutti i nodi (usa eccezione)
     HeadElem() -> riavvolge e preleva il valore dal primo nodo della lista
*/

public class LLCoda {
  private Lista elem;
    
  //costruttori
  public LLCoda() {
    elem = new Lista();
  }
    
  //metodi canonici
  public boolean IsEmpty() {return elem.IsEmpty();}

  public void Clear() {
    try {
      while(true)
        elem.DeleteHead();
    } catch (EmptyListException e) {}
  }
  
  public void EnQueque(int val) {
    elem.InsertTail(val);
  }
  
  public int DeQueque() {
    if (IsEmpty())
      throw new CodaEmptyException();
    return elem.DeleteHead();
  }
  
  public int HeadElem() {
    if (IsEmpty())
      throw new CodaEmptyException();
    elem.rewind();
    return elem.getNextElem();
  }
}

//Eccezione personalizzata per la classe Coda.
class CodaEmptyException extends RuntimeException {
  public CodaEmptyException() {
    super("Coda Vuota.");
  }
  public CodaEmptyException(String msg) {
    super(msg);
  }
  
}