Академический Документы
Профессиональный Документы
Культура Документы
3.1 Pilas.
3.2 Colas.
3.3.1 Simples.
3.3.2 Dobles.
Stack (pila)
• Una pila (Stack) es un contenedor de objetos
que se insertan y eliminan de acuerdo con el
principio: último en entrar primero en salir
(LIFO, Last Input First Output)
• Los elementos se insertan de uno en uno
(push, apilar)
• Se sacan (extraen) en orden inverso al que
se insertaron (pop, desapilar)
• Único elemento que se puede observar
(examinar) es top o cima
Stack (pila)
Aplicaciones
Estructuras auxiliares en numerosos
algoritmos y esquemas de programación:
Recorridos (profundidad) de árboles y grafos
Evaluación de expresiones
Conversión entre notaciones de expresiones
(postfija, prefija, infija)
Operación Deshacer en editores de texto
Operación Volver Hacia Atrás en un
navegador en la secuencia de páginas web
Stack (pila)
Implementaciones
Mediante un array ⇒ (T *elementos; int
numElementos; int maxElem;)
numElementos = 0 ⇒ pila vacía
elementos[0] ⇒ fondo de la pila
elementos[numElementos – 1] ⇒ cima de la pila
Ejemplo1: Ejemplo2:
Infija: (x+z)*w/t^y-v Infija: (a+b*c)/d*k^1
Postfija: xz+w*ty^/v- Postfija: abc*+d/k1^*
Prefija: -*+xz/w^tyv Prefija: /+a*bc*d^k1
Precedencia de los operadores
1) ^ circunflejo
2) / *
3) +-
Nota: Al terminar de analizar la expresión, sacar todos los símbolos que queden en
la pila y agregarlos a la solución.
Queue (cola)
• Una cola (Queue) es un contenedor de
objetos que se insertan por el extremo final
y extraen por el extremo opuesto: frente
• Siguen el principio de: primero en entrar
primero en salir (FIFO, First Input First
Output)
• El único elementos observable (accesible)
en todo momento es el primero que fue
insertado (primero en la secuencia) ⇒ frente
• TAD Queue ⇒ cuya extensión da lugar al
TAD doble cola (DQueue)
Queue (cola)
Aplicaciones
Simular situaciones reales: caja del
supermercado, surtidor de combustible, etc.
Colas de trabajos a realizar por cualquier
dispositivo: una impresora, un disco, etc.
Scheduler: asignación de tiempo de
procesador a los procesos en un sistema
operativo multiusuario (sin prioridad)
Algoritmos de búsqueda en anchura sobre
árboles y grafos
Queue (cola)
Implementaciones
Mediante un array (Pila) ⇒ (T *elementos; int
numElementos; int maxElem;)
numElementos = 0 ⇒ cola vacía
frente (front) = elementos[0]
final (back/rear) = elementos[numElementos – 1]
Coste de las operaciones (Extraer)?
Mediante una lista enlazada ⇒ (PNodo
frente, final; int numElementos)
No hay limitación de tamaño
Queue (cola)
El TAD Doble Cola
• Permite consultar, añadir y eliminar
elementos en cualquiera de los dos
extremos de la estructura lineal ⇔ bicola
• Especificación algebraica ⇒ Ejercicio
• Implementaciones:
– Lista simplemente encadenada ⇒ Problema:
Extraer un elemento por la derecha coste O(n)
– Lista doblemente encadenada ⇒ Ventajas: (1)
Todas operaciones coste temporal cte. O(1) y (2)
Punteros a primero (front) y último (back)
simplifican operaciones de Insertar y Extraer
Colas
La Cola es una estructura de datos donde la
inserción de datos se hace en un extremo del arreglo
(el fin de la cola) y la recuperación/borrado de
elementos se hace en el otro extremo (el inicio de la
cola). Como el primer elemento insertado es el
primero en ser recuperado, los desarrolladores se
refieren a estas colas como estructuras FIFO (first-in,
first-out) (primero en entrar, primero en salir).
La cola lineal de la figura anterior almacena cuatro enteros, con el entero 1 en primer lugar. Esa
cola está llena y no puede almacenar más datos adicionales porque rear identifica la parte final
de la cola. La razón de la posición vacía, que identifica front, implica el comportamiento lineal
de la cola. Inicialmente, front y rear identifican la posición más a la izquierda, lo que indica que
la cola está vacía. Para almacenar el entero 1, rear avanza una posición hacia la derecha y
almacena 1 en esa posición. Para recuperar/borrar el entero 1, front avanza una posición hacia
la derecha.
La cola circular de la figura anterior tiene siete datos enteros, con el entero 1 primero.
Esta cola está llena y no puede almacenar más datos hasta que front avance una
posición en sentido horario (para recuperar el entero 1) y rear avance una posición
en la misma direción (para identificar la posición que contendrá el nuevo entero). Al
igual que con la cola lineal, la razon de la posición vacía, que identifica front, implica
el comportamiento circular de la cola. Inicialmente, front y rear identifican la misma
posición, lo que indica una cola vacía. Entonces rear avanza una posición por cada
nueva inserción. De forma similar, front avanza una posición por cada
recuperación/borrado.
Las colas son muy útiles en varios escenarios de programación, uno de ellos es:
Trabajos de impresión:
Como una impresora normalmente es más lenta que un ordenador, un sistema
operativo maneja los trabajos de impresión en un subsistema de impresión, que
inserta esos trabajos de impresión en una cola. El primer trabajo en esa cola se
imprime primero, y así sucesivamente.
Listas.
Existe una gran variedad de estructuras denominadas listas.
En las listas debe asumirse que el espacio de un nodo no es contiguo con otro;
por esta
razón no basta incrementar en uno, el puntero a un nodo, para obtener la
dirección de inicio del nodo siguiente.
Cada nodo está conectado con el siguiente mediante un puntero que es un campo
del nodo.
Los siguientes diagramas ilustran una lista vacía y una lista con tres elementos. Si
los nodos se crean en el heap, la variable lista debe estar definida en el stack, o
en la zona estática, con el tipo puntero a nodo.
• Ejemplo
Lista de calificaciones ::= <Alumno> + {<Alumno>}
<Alumno>::= <<DNI>> + <<NIA>> + <Apellido1> + <Apellido2> +
<Nombre> + <Calificación>
Listas: descripción lógica
• Listas ≠ Arrays
– Listas son flexibles y permiten cambio de implementación
• Operaciones
– Insertar, Borrar, Modificar, etc.
• Tipos de listas
– Simples
– Ordenadas
– Pilas
– Colas
– Doblemente enlazadas (LDE)
– Circulares
Implementaciones
Estática Dinámica
tamaño = 4 tamaño = 3
max = 4 max = 8
tamaño = 3
Secuencial
elem[i] = G N U I S N O T
elem[i] = G N U · · · · i= 1 2 3 4 5 6 7 8
posición = i
i= min +1 +2 ... ... ... max
Vector ampliado
tamaño = 5
Enlazada
tamaño = 3
N
G I
elem[i] = G 4 · · · · N· 5 U 0 · · · ·
U S null
i= 1 2 3 4 5 … max posición
posición = i
Listas Simples
• Lista Simple = colección de elementos homogéneos cuya relación
lineal es determinada por la posición del elemento en la lista
• Comienzo + Enlace al siguiente (≠ puntero)
• Definición:
<listaSimple> ::= <comienzo> + {<nodo>}
<nodo> ::= <informacion> + <enlace>
<informacion> ::= <<dato>>{<<dato>>}
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<comienzo> :: =<enlace>
TAD Lista Simple: operaciones
Creación de una lista crearLista (nombreLista)
info(referenciaNodo) → Informacion
Acceso a los nodos
siguiente(referenciaNodo) → enlace
Modificación de los asignarInfo(referenciaNodo, valorInformacion)
nodos asignarEnlace(referenciaNodo, valorEnlace)
Listas Simples
• Aclaraciones a las operaciones:
– listaLlena sólo tiene sentido si lista es acotada
– acceso y modificación serán métodos get y put
• Ejemplo y pseudocódigo
– insertar (nombreLista, valorInfo, posición)
– insertar (nombreLista, valorInfo)
– borrar (nombreLista, valorInfo)
– buscar (nombreLista, dato) → ι ν φ ο ρ µ α χ ι ón
– recorrer (nombreLista)
• Inserción: casos…
Listas Ordenadas
• La posición de cada nodo viene determinada por el valor de uno o
más campos obligatorios de información del nodo denominados
clave
• No se permite tener dos nodos con la misma clave
• Definición
<listaOrdenada> ::= <comienzo> + {<nodo>}
<comienzo> ::= <enlace>
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<nodo> ::= <clave> + <informacion> + <enlace>
<clave> ::= <<dato>>{<<dato>>}
<informacion> ::= {<<dato>>}
TAD Lista Ordenada: operaciones
Creación de una lista crearLista (nombreLista)
• Definición
<pila> ::= <cabecera> + {<nodo>}
<cabecera> ::= <enlace>
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<nodo> ::= <informacion> + <enlace>
<informacion> ::= <<dato>>{<<dato>>}
TAD Pila: operaciones
Creación de pila crearPila (nombrePila)
• Definición
<cola> ::= <frente> + <final> + {<nodo>}
<frente> ::= <enlace>
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<final> ::= <enlace>
<nodo> ::= <informacion> + <enlace>
< informacion > ::= <<dato>>{<<dato>>}
TAD Cola: operaciones
Creación de cola crearCola (nombreCola)
• Listas de espera
• Acceso a recursos compartidos dedicados (v.g., impresoras)
• Multiprogramación de la CPU
Listas Doblemente Enlazadas
• Relación lineal en ambos sentidos
• Enlace a predecesor y antecesor en cada nodo
• Recorrido puede ser en ambos sentidos
• Pueden ser simples u ordenadas
• Definición:
<lde> ::= <comienzo> + {<nodo>}
<comienzo> :: = <enlace>
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<nodo> ::= <informacion> + <predecesor> + <sucesor>
<predecesor> ::= <enlace>
<sucesor> ::= <enlace>
<informacion> ::= <<dato>>{<<dato>>}