Universidad Carlos III de Madrid

Ingeniería de Telecomunicación

Enero-Mayo 2010 / January-May 2010

Listas Enlazadas, Pilas y Colas

Objectives Section Objetivos de aprendizaje

Objetivos de aprendizaje para Pilas y Colas

  • Definir el concepto de cola (Bloom 1).

  • Describir la interfaz pública de una cola (Bloom 1).

  • Enumerar posibles aplicaciones de una cola (Bloom 1).

  • Definir el concepto de pila (Bloom 1).

  • Describir la interfaz pública de una pila (Bloom 1).

  • Enumerar posibles aplicaciones de una pila (Bloom 1).

  • Definir el concepto de lista enlazada (Bloom 1).

  • Definir el concepto de cola doble (deque) (Bloom 1).

  • Describir la interfaz de una cola doble (deque) (Bloom 1).

  • Definir el concepto de cola con prioridad (Bloom 1).

  • Describir la interfaz de una cola con prioridad (Bloom 1).

  • Explicar cómo cambia el estado de una cola ante sucesivas operaciones de inserción y extracción de datos. (Bloom 2*)

  • Explicar cómo cambia el estado de una pila ante sucesivas operaciones de inserción y extracción de datos. (Bloom 2*)

  • Explicar cómo cambia el estado de una cola doble ante sucesivas operaciones de inserción y extracción de datos por cualquiera de sus extremos (Bloom 2).

  • Explicar por qué la implementación de una cola sobre una lista enlazada requiere que las operaciones de inserción y extracción se realicen en extremos opuestos de la lista (Bloom 2).

  • Explicar por qué para implementar una cola sobre una lista enlazada es recomendable almacenar una referencia al último nodo de la lista (Bloom 2).

  • Explicar por qué para implementar una cola sobre una lista enlazada resulta más adecuado realizar las operaciones de extracción por el principio de la lista y las de inserción por el final (Bloom 2).

  • Explicar por qué la implementación de una pila sobre una lista enlazada requiere que las operaciones de inserción y extracción se realicen en el mismo extremo de la lista, y por qué este extremo debe ser el principio de la lista y no el final (Bloom 2).

  • Programar una cola mediante un array. (Bloom 3*)

  • Programar una pila mediante un array. (Bloom 3*)

  • Programar una cola mediante una lista enlazada. (Bloom 3*)

  • Programar una pila mediante una lista enlazada. (Bloom 3*)

  • Programar una cola mediante una cola doble (Bloom 3).

  • Programar una pila mediante una cola doble (Bloom 3).

  • Programar una cola doble mediante una lista doblemente enlazada (Bloom 3).

  • Programar aplicaciones sencillas que utilicen colas. (Bloom 3*)

  • Programar aplicaciones sencillas que utilicen pilas. (Bloom 3*)

  • Resolver cuestiones teóricas básicas acerca del funcionamiento de una cola. (Bloom 3*)

  • Resolver cuestiones teóricas básicas acerca del funcionamiento de una pila. (Bloom 3*)

  • Resolver cuestiones teóricas básicas acerca del funcionamiento de una cola doble (Bloom 3).

  • Programar un método que permita eliminar un nodo cualquiera en una lista enlazada (Bloom 3).

  • Programar un método que permita insertar un nodo en cualquier posición de una lista enlazada (Bloom 3).

  • Explicar las ventajas y desventajas de arrays frente a listas enlazadas para implementar pilas y colas. (Bloom 4*)

  • Dado un problema de programación sencillo, identificar la necesidad de utilizar una cola o una pila para resolverlo (Bloom 4).

  • Explicar cómo en un lenguaje de programación se puede dar soporte al concepto de subrutina (método) mediante una pila (Bloom 4).

  • Explicar cómo en un lenguaje de programación se puede dar soporte al concepto de recursividad mediante una pila (Bloom 4).

  • Resolver problemas que involucren el uso de listas enlazadas más complejas (p.e. listas doblemente enlazadas y listas circulares), partiendo de un diseño inicial de la solución que se proporcione con el enunciado y describa la estructura de datos a utilizar (Bloom 5).

Lecture Section Sesión 1 (teoría): Listas enlazadas

Material

Lab Section Sesión 2 (laboratorio): Listas enlazadas

Material

Material (con soluciones)

Lecture Section Sesión 3 (teoría): Pilas y Colas

Material

Lab Section Sesión 4 (laboratorio): Pilas y Colas

Material

Material (con soluciones)

Learning Pills Section Píldoras de aprendizaje

¿SABÍAS QUE...?

Java usa una pila (pila de ejecución) para almacenar todos los métodos de un programa que se encuentran en el hilo de ejecución en un instante determinado.

¿SABÍAS QUE...?

Java permite controlar el tamaño de la pila del hilo de ejecución de un programa.

¿SABÍAS QUE...?

El API de Java ofrece una clase pila llamada Stack que no se recomienda usar.

¿SABÍAS QUE...?

Para implementar una pila, se puede utilizar la clase Array básica. La propiedad fundamental de un array es que se declare un tamaño antes para que el compilador coja la cantidad correcta de memoria. Sin embargo, si no sabemos la cantidad exacta de elementos, es difícil escoger el tamaño. Para ello, y en vez de usar Vector, se puede utilizar el array con la técnica de expansión dinámica de arrays. Así, si tenemos un array de 10 elementos

int [] arr = new int[10];
					
y a medida que se ejecuta la aplicación necesitamos más espacio, podemos usar esa técnica.

¿SABÍAS QUE...?

El API de Java ya te ofrece una clase consistente en un array que implementa la técnica de la expansión dinámica de arrays.

¿SABÍAS QUE...?

De las dos formas que hay para implementar pilas, con arrays (Array o ArrayList) o con listas enlazadas (LinkedList), generalmente es más eficiente hacerlo con arrays, sobre todo cuando se puede dar una estimación de la capacidad inicial.

¿SABÍAS QUE...?

De las dos formas que hay para implementar colas, con arrays (Array o ArrayList) o con listas enlazadas (LinkedList), generalmente es más eficiente hacerlo con listas enlazadas.

¿SABÍAS QUE...?

Las colas no permiten el acceso aleatorio a los elementos de las mismas.

¿SABÍAS QUE...?

Se puede usar una pila auxiliar para invertir el orden de los elementos de una cola.

¿SABÍAS QUE...?

Las operaciones básicas de apilar y desapilar en la pila, y encolar y desencolar en la cola, tienen una complejidad O(1).

¿SABÍAS QUE...?

En los GUIs de Java, se usa una cola para almacenar los eventos de las interacciones con el usuario de la aplicación.

¿SABÍAS QUE...?

Una cola doble (deque) puede usarse para implementar una pila.

¿SABÍAS QUE...?

Una cola doble (deque) puede usarse para implementar una cola.

¿SABÍAS QUE...?

En una cola implementada con listas enlazadas (LinkedQueue) la operación de enqueue() puede ser muy costosa si no se toman las medidas adecuadas.

¿SABÍAS QUE...?

La implementación de una pila basada en un array (ArrayStack) es tan eficiente como la implementación de una cola basada en un array (ArrayQueue) si este es circular.

¿SABÍAS QUE...?

Java proporciona un objeto iterador (Iterator) para recorrer una lista; sin embargo, no existe dicho objeto ni para recorrer una pila (Stack) ni una cola (Queue).