import java.io.*;

abstract class Lista {
  protected class Elem {
    private Object ob;
    private Elem next;
		
    public Elem( Object ob, Elem next ) {
      this.ob = ob;
      this.next = next;
    }
    public Object getElem() {
      return ob;
    }
    public Elem getNext() {
      return next;
    }
    public void setNext( Elem proximo ) {
      next = proximo;
    }
  }  //Elem
  protected Elem prim;
  protected int nbelem;
	
  public Lista() {
    nbelem = 0;
    prim = null;
  }
  public int length() {
    return nbelem;
  }
  abstract void insere( Object ob );
  abstract Object retira();
}

class Fila extends Lista {
  public Fila() {
    super();
  }
  public void insere( Object ob ) {
    nbelem++;
    Elem aux = new Elem( ob, prim );
    prim = aux;
  }
  public Object retira() {
    Object aux = null;

    if( nbelem == 1 ) {
      nbelem = 0;
      aux = prim.getElem();
      prim = null;
    }
    else if( nbelem > 1 ) {
      Elem penultimo = prim,
	   ultimo = prim.getNext();
      for( ; ultimo.getNext() != null ; ultimo = ultimo.getNext() )
	penultimo = ultimo;
      aux = ultimo.getElem();
      penultimo.setNext(null);
      nbelem--;
    }
    return aux;
  }
}

class Pilha extends Lista {
  public Pilha() {
    super();
  }
  public void insere(Object ob) {
    nbelem++;
    Elem aux = prim;
    prim = new Elem( ob, aux );
  }
  public Object retira() {
    Object aux = null;

    if( nbelem > 0 ) {
      aux = prim.getElem();
      nbelem--;
      prim = prim.getNext();
    }
    return aux;
  }
  public void push( Object ob ) {
    this.insere(ob);
  }
  public Object pop() {
    return this.retira();
  }
}

class ManipulaLista {
  private Lista l;

  public ManipulaLista() {
    l = new Fila();
  }
  public ManipulaLista( Lista l ) {
    this.l = l;
  }
  public void encheLista() {
    String linha;
    InputStreamReader teclado = new InputStreamReader( System.in );
    BufferedReader console = new BufferedReader(teclado);

    for( int i = 0 ; i < 10 ; i++ ) {
      try { 
	System.out.print("Entre texto " + (i+1) + " de 10: " );
	linha = console.readLine();
      }
      catch ( Exception e ) {
        System.out.println("Nao conseguiu ler...");
        return;
      }
      //l.insere(new String(linha));
      l.insere( linha );
    }
  }
  public void esvaziaLista() {
    for( int i = l.length() ; i > 0 ; i-- )
      System.out.println( "Retirado: " +  l.retira() );
  }
}

public class UsaLista {
  public static void main (String args[]) {
    ManipulaLista ml;
    
    System.out.println("Manipulando uma Fila");
    Fila f = new Fila();
    ml = new ManipulaLista( f );
    ml.encheLista();
    ml.esvaziaLista();
    
    System.out.println("Manipulando uma Pilha");
    Pilha p = new Pilha();
    ml= new ManipulaLista( p );
    ml.encheLista();
    ml.esvaziaLista();
  }
}

