Unidad IV Colas

49
arado por: Damián Nicolalde-R. Diciembre 2013 Estructura de Datos I Unidad IV – Colas

description

Estructura de datos, todo referente a colas.

Transcript of Unidad IV Colas

Estructura de Datos I

Unidad IV – Colas

Colas• Una cola es una estructura de datos,

caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir.

Colas• Una cola constituye una estructura lineal de datos en

la que los nuevos elementos se introducen por un extremo y los ya existentes se eliminan por el otro. Es importante señalar que los componentes de la cola se eliminan en el mismo orden en el cual se insertaron. Es decir, el primer elemento que se introduce en la estructura será el que se eliminará en primer orden. Debido a esta característica, las colas también reciben el nombre de estructuras FIFO (First-In, First-Out: el primero en entrar es el primero en salir).

Representación de colas• Las colas, al igual que las pilas, no existen

como estructuras de datos estándar en lo lenguajes de programación. Este tipo de estructura de datos se puede representar mediante el uso de:

• Arreglos• Listas

Representación de colas• Cuando se implementan con arreglos unidimensionales,

es importante definir un tamaño máximo para la cola y dos variables auxiliares. Una de ellas para que almacene la posición del primer elemento de la cola -FRENTE- y otra para que guarde la posición del último elemento de la cola -FINAL-. En siguiente figura se muestra la representación de una cola en la cual se han insertado tres elementos: 111, 222 y 333, en ese orden.

• El elemento 111 está en el FRENTE ya que fue el primero que se insertó; mientras que el elemento 333, que fue el último en entrar, está en el FINAL de la cola.

Operaciones con colas• La definición de la estructura de datos tipo cola queda completa al incluir las

operaciones que se pueden realizar en ella. Las operaciones básicas que pueden efectuarse son:– Insertar un elemento en la cola– Eliminar un elemento de la cola

• Las inserciones se llevarán a cabo por el FINAL de la cola, mientras que las eliminaciones se harán por el FRENTE -recuerde que el primero en entrar es el primero en salir.

• Considerando que una cola puede almacenar un máximo número de elementos y

• que además FRENTE indica la posición del primer elemento y FINAL la posición del

• último, se presentan a continuación los algoritmos correspondientes a las operaciones

• mencionadas.

Inserta_cola

Elimina_cola

Cola_vacía

Cola_llena

Utilización • Las colas se utilizan en sistemas informáticos,

transportes y operaciones de investigación (entre otros), dónde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas.

Utilización

Utilización • Las colas, al igual que las pilas, resultan de aplicación habitual en

muchos problemas informáticos. Quizás la aplicación más común de las colas es la organización de tareas de un ordenador. En general, los trabajos enviados a un ordenador son "encolados" por éste, para ir procesando secuencialmente todos los trabajos en el mismo orden en que se reciben. Cuando el ordenador recibe el encargo de realizar una tarea, ésta es almacenada al final de la cola de trabajos. En el momento que la tarea que estaba realizando el procesador acaba, éste selecciona la tarea situada al principio de la cola para ser ejecutada a continuación. Todo esto suponiendo la ausencia de prioridades en los trabajos. En caso contrario, existirá una cola para cada prioridad.

Utilización• Del mismo modo, es necesaria una cola, por

ejemplo, a la hora de gestionar eficientemente los trabajos que deben ser enviados a una impresora (o a casi cualquier dispositvo conectado a un ordenador). De esta manera, el ordenador controla el envio de trabajos al dispositivo, no enviando un trabajo hasta que la impresora no termine con el anterior.

Representación de las colas en C#

• Al igual que con las pilas, el primer paso de la implementación será decidir el prototipo de los métodos que vamos a utilizar.

• La idea básica será seguir en la misma línea del tema anterior, buscando la máxima similitud entre las operaciones de pilas y colas.

• Así las operaciones del interfaz que tendremos serán las siguientes, recordando que las operaciones que puedan devolver errores, devolverán un bool (true o false).

Operaciones a crear• Cola (void);• bool Encolar (Valor);• bool Desencolar (void);• bool PrimeroCola (Valor &);• bool ColaVacia (void);• Para determinar concretamente cada una de estas

operaciones y su implementación, es necesario especificar un tipo de representación para las colas. Dependiendo de esta representación tendremos diferentes implementaciones.

Ejemplo de utilización de colas• Realizar una función en C# que nos diga el número

de elementos que contiene una cola pasada como parámetro.

• Para saber el número de elementos tendremos que ir desencolandolos de la cola y contando los elementos hasta que la cola se quede vacía. Para asegurarnos que la cola no queda modificada podemos pasarla por valor, o pasarla por referencia y si en algún momento la modificamos, devolverla antes de terminar la función a su valor original.

El algoritmo para el segundo casoAlgoritmo ContarElementosEntradas: Cola que;Salidas: Cola que;

Entero num_ele;Variables Cola q_aux;

Entero x;Inicio

q_aux = CrearCola ()num_ele = 0Mientras (No ColaVacia(que) ) Hacer

x = Desencolar (que)Encolar (q_aux, x)num_ele = num_ele + 1

Fin_mientrasMientras (No ColaVacia (q_aux) ) Hacer

Encolar (que, Desencolar (q_aux) )Fin_mientrasDevolver (num_ele)

Fin

El organigrama del algoritmo anterior sería

Queue<T> (Clase)• Representa una colección de objetos de tipo

primero en entrar, primero en salir.• Espacio de nombres:

System.Collections.Generic• Ensamblado: System (en System.dll)• Parámetros de tipo

T– Especifica el tipo de elementos en la cola.

Constructores

Propiedades

Métodos

Ejemplo • En el ejemplo de código siguiente se muestran varios métodos de la clase

genérica Queue<T>. En este ejemplo de código se crea una cola de cadenas con capacidad predeterminada y se utiliza el método Enqueue para poner en la cola cinco cadenas. Se enumeran los elementos de la cola, lo que no cambia el estado de la cola. Se utiliza el método Dequeue para quitar la primera cadena de la cola. Se usa el método Peek para localizar el siguiente elemento de la cola y, a continuación, se utiliza el método Dequeue para quitarlo de la cola.

• También se usa el método ToArray para crear una matriz y copiar en ella los elementos de la cola; a continuación, se pasa esta matriz al constructor Queue<T> que toma IEnumerable<T> y se crea una copia de la cola. Después, se muestran los elementos de la copia.

• Se crea una matriz del doble de tamaño que el de la cola y se utiliza el método CopyTo para copiar los elementos de la matriz, empezando por el centro de la matriz. Se vuelve a usar el constructor Queue<T> para crear una segunda copia de la cola, que contiene tres elementos null al principio.

• Se utiliza el método Contains para mostrar que la cadena "four" está en la primera copia de la cola y, después, el método Clear borra la copia y la propiedad Count muestra que la cola está vacía.

Colas lineales (estructuras estáticas)

• La representación de una cola finita en forma de vector es una tarea algo más compleja que la realizada para el caso de las pilas. Además de un array unidimensional, son necesarias un par de variables que indiquen dónde está el inicio de la cola y dónde el final.

• Si son ini y fin las dos variables que apuntan a los extremos de la estructura, normalmente se adopta el convenio de que la variable ini sea siempre la posición real del primer elemento y que la variable fin siempre apunte a la siguiente posición de la cola donde podemos insertar nueva información. De esta manera, se cumplirá que ini=fin si y sólo si la cola está vacía, y la condición inicial para indicar que se ha creado una cola vacía será ini=fin=0.

Colas lineales • Tal como hicimos con la definición del tipo pila,

la definición ‘compacta’ del tipo cola sería:public class Cola{

private Vector info;private int ini, fin;

}Ver programa ColasLineales

Colas Circulares• Se implementan con un vector, pero se

optimiza el espacio de él vector.• Las colas circulares permiten la reutilización

de espacio que se desperdicia en una cola no circular estática.

Colas Circulares• Una cola circular constituye una estructura de

datos lineal en la cual el siguiente elemento del último en realidad es el primero.

• De esta manera se utiliza de manera más eficiente la memoria de la computadora.

• En la figura siguiente se muestra la representación gráfica de una cola circular.

En la figura se muestra como se actualizan los punteros FRENTE y FINAL en una cola circular, a medida que se insertar o se eliminan los elementos.En la figura a) la cola tiene algunos elementos (FRENTE=2 y FINAL=8).En la figura b) se han eliminado de la cola dos elementos , primer se quito XX y luego YY, quedando FRENTE=4

En la figura c) se ha insertado un nuevo elemento PP en la cola. Como FINAL = MAX se llevó el apuntador a la primera posición que estaba vacía (FINAL=1)

Insertar datos Cola Circular

Eliminar dato Cola Circular

Ejemplo

Otra manera de hacerlo - Colas Circulares

Colas circulares

Colas circulares – Ingresar un dato

Colas circulares – Ingresar un dato

Colas circulares – sacar un dato

Colas circulares – sacar un dato

Colas circulares – ingresar un dato después de hacer el borrado de algunos

Colas circulares – ingresar un dato después de hacer el borrado de algunos

Doble Cola• Una doble cola o bicola es una generalización

de una estructura de datos tipo cola. Es una doble cola, los elementos se pueden insertar o eliminar por cualquiera de los dos extremos. Es decir, se pueden insertar o eliminar por el FRENTE como por el FINAL de la cola.

• En la siguiente figura se puede observar que las dos flechas en cada extremo indican que ambas operaciones son posibles.

Doble Cola

Existen dos variantes de dobles colas:• Doble cola con entrada restringida: permite que las eliminaciones se realicen por

cualesquiera de los dos extremos, mientras que las inserciones solo por el FINAL de la cola.

• Doble cola con salida restringida: permite que las inserciones se realicen por cualesquiera de los dos extremos, mientras que las eliminaciones sólo por el FRENTE de la cola.

En la siguiente figura podemos observar de forma gráfica lo explicado.

Doble Cola

Colas enlazadas• Ver programa colas dinámicas

Bibliografía • Ceballos, Javier: “Microsoft C# - Curso de

Programación”, 2da. Edición, México DF, 2013.