21 de abril de 2017

Colas (implementación).

   El nodo genérico definido en la clase del Ejemplo NodoG ya ha sido presentado con anterioridad en la sección Pila genérica de la entrada Pilas (implementación) y no se explicará nuevamente. Dicho ejemplo sólo se ha incluido aquí como referencia inmediata al lector para facilitarle la relación y la completa comprensión de la implementación de la cola de espera.

   De manera análoga, el Ejemplo ExcepcionEDVacia muestra la excepción utilizada por la implementación de la cola. Dicha clase también ha sido explicada con anterioridad.

   Se invita al lector a revisar estos dos ejemplos iniciales como preámbulo a la implementación de la cola de espera. En caso de que surgiera alguna duda, consulte las entradas correspondientes a los ejemplos mencionados en los párrafos anteriores.

   La implementación de la cola de espera se muestra en el Ejemplo Cola. Antes de comenzar con la explicación de los métodos que implementan las operaciones primitivas, insto amablemente al lector a que compare el diagrama de clases de la siguiente figura con el código del Ejemplo Cola, esto con la intención de que identifique la relación que existe entre el diseño y la implementación representados por el diagrama de clases y el código respectivamente.

Diagrama de clases UML para la cola de espera del Ejemplo Cola.

    La identificación y comprensión de atributos y constructores deberían resultar totalmente claros para el lector, excepto quizá por el modificador de nivel de acceso protected, el cual hace que el atributo correspondiente sea accesible únicamente por las clases del mismo paquete, o por subclases de la clase que lo define. Dicho lo anterior, la explicación del Ejemplo Cola iniciará con los siguientes métodos (ambos métodos fueron descritos en la implementación de la pila genérica de la entrada Pilas (implementación); de hecho son idénticos, excepto por una pequeña diferencia que sería muy bueno que el lector identificara):
  •  estaVacia (líneas 47-49) realiza una verificación bastante simple: si inicio es igual a null, regresa verdadero (la cola está vacía); si no, regresa falso (existe al menos un elemento).
  • imprime (líneas 52-55) si la estructura de datos está vacía (línea 53) se reporta (línea 54); en caso contrario, se realiza un recorrido por todos los nodos de la estructura para imprimir su contenido (líneas 57-62).
   Los dos métodos restantes corresponden a las dos operaciones primitivas que fueron definidas para una cola de espera, y se describen a continuación:
  1. El método inserta verifica en la línea 21 si la cola está vacía; si lo está, se crea un nuevo nodo que contiene a elemento y se hace que tanto inicio como fin hagan referencia a dicho nodo (objeto).
  2. Si la cola no está vacía (línea 23), se crea un nuevo nodo y se agrega al final de la cola (línea 25); adicionalmente, se establece que el último elemento es referido por fin (línea 26).
  3. El método elimina verifica (línea 32) si la cola está vacía; si lo está crea y lanza la excepción ExcepcionEDVacia (línea 33); en caso contrario, recupera el dato almacenado (línea 35) y actualiza las referencias correspondientes para inicio y fin (líneas 38-41), para finalmente, regresar el dato recuperado referido por elemento (línea 43).
   La clase de prueba para la cola de espera del Ejemplo Cola se muestra en el Ejemplo PruebaCola. La línea 6 define la clase (Integer) de los elementos a insertar en la cola de espera, mientras que las líneas 9-12 realizan la inserción de los números del cero al nueve. Note que por cada inserción, se imprime todo el contenido de la cola.

   Por otro lado, las líneas 15-24 realizan la eliminación de los elementos de la cola. Dicho fragmento de código intenta eliminar once elementos en las líneas 17-18 (recuerde que sólo fueron insertados diez elementos, por lo que al intentar eliminar el décimo primero se generará la excepción ExcepcionEDVacia), y dado que el método elimina puede lanzar una excepción, el código involucrado en la eliminación debe estar dentro de una cláusula try-catch-finally, la cual permite atrapar (cachar) las excepciones que un método pudiera lanzar.

   La salida del Ejemplo PruebaCola se muestra en la siguiente figura. Asegúrese de comprender, antes de continuar, por qué se generan cada uno de los elementos (renglones) que componen dicha salida.

Salida del Ejemplo PruebaCola.