Implementación de cola de espera (C++).

   El ejemplo C++ para la implementación de una cola de espera contiene dos clases que ya han sido presentadas con anterioridad: el nodo genérico definido en la clase Nodo (presentado en la entrada Pilas (implementación)) y  la clase excepcion_ED_vacia por lo que no se explicarán nuevamente aquí. Se invita al lector a revisar dicha información con los ejemplos iniciales de implementación de estructuras de datos como secuencia de nodos como preámbulo para la comprensión de la implementación de una cola de espera.

   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 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. Dicha palabra reservada hace que los elementos declarados en su ámbito sean accesibles únicamente por la propia clase o por clases derivadas (subclases) de la clase que los declara. 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):
  •  esta_vacia (líneas 136-139) realiza una verificación bastante simple: si inicio es igual a nullptr, regresa verdadero (la cola está vacía); si no, regresa falso (existe al menos un elemento).
  • imprime (líneas 142-156) si la estructura de datos está vacía (línea 144) se reporta (línea 145); en caso contrario, se realiza un recorrido por todos los nodos de la estructura para imprimir su contenido (líneas 146-155).
   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 108 si la cola está vacía; si lo está, se crea un nuevo nodo (línea 109) 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 110), se crea un nuevo nodo y se agrega al final de la cola (línea 111); adicionalmente, se establece que el último elemento es referido por fin (línea 112).
  3. El método elimina verifica (línea 119) si la cola está vacía; si lo está crea y lanza la excepción excepcion_ED_vacia (línea 120); en caso contrario, recupera el dato almacenado (línea 122) y actualiza las referencias correspondientes para inicio y fin (líneas 126-129), para finalmente, regresar el dato recuperado referido por elemento (línea 132). Note también que en la línea 123 se estableció tmp al nodo de inicio de la cola, con la finalidad de eliminar dicho nodo en la línea 130 después de realizar los ajustes correspondientes.
    La palabra virtual (líneas 43 y 44) significa que "puede ser redefinido posteriormente en una clase derivada de esta" [Stroustrup]. Esta característica se utilizará para la definición de las colas de prioridad.
 
   La función main que pone a prueba para la cola de espera del Ejemplo cola se muestra en las líneas 178-202. Las líneas 183-186 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 y que la cola almacenará objetos string (línea 180).

   Por otro lado, las líneas 189-199 realizan la eliminación de los elementos de la cola. Dicho fragmento de código intenta eliminar once elementos (recuerde que sólo fueron insertados diez elementos, por lo que al intentar eliminar el décimo primero se generará la excepción excepcion_ED_vacia), 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 cola se muestra a continuación. Asegúrese de comprender, antes de continuar, por qué se generan cada uno de los elementos (renglones) que componen dicha salida.

La Cola genérica es: 0
La Cola genérica es: 0 1
La Cola genérica es: 0 1 2
La Cola genérica es: 0 1 2 3
La Cola genérica es: 0 1 2 3 4
La Cola genérica es: 0 1 2 3 4 5
La Cola genérica es: 0 1 2 3 4 5 6
La Cola genérica es: 0 1 2 3 4 5 6 7
La Cola genérica es: 0 1 2 3 4 5 6 7 8
La Cola genérica es: 0 1 2 3 4 5 6 7 8 9

Elemento eliminado de la cola: 0
La Cola genérica es: 1 2 3 4 5 6 7 8 9
Elemento eliminado de la cola: 1
La Cola genérica es: 2 3 4 5 6 7 8 9
Elemento eliminado de la cola: 2
La Cola genérica es: 3 4 5 6 7 8 9
Elemento eliminado de la cola: 3
La Cola genérica es: 4 5 6 7 8 9
Elemento eliminado de la cola: 4
La Cola genérica es: 5 6 7 8 9
Elemento eliminado de la cola: 5
La Cola genérica es: 6 7 8 9
Elemento eliminado de la cola: 6
La Cola genérica es: 7 8 9
Elemento eliminado de la cola: 7
La Cola genérica es: 8 9
Elemento eliminado de la cola: 8
La Cola genérica es: 9
Elemento eliminado de la cola: 9
Vacia: Cola genérica
terminate called after throwing an instance of 'excepcion_ED_vacia'
  what():  Estructura de datos vacía
Abortado


No hay comentarios.:

Publicar un comentario