Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Objetivos
Contenidos
Contenidos
Duración
5 clases (7.5 h)
Bibliografía
Características:
5 existe un elemento llamado primero
5 existe un elemento llamado último
5 cada elemento, excepto el primero, tiene un único predecesor
5 cada elemento, excepto el último, tiene un único sucesor
Operaciones básicas:
5 crear la estructura vacía
5 insertar un elemento
5 borrar un elemento
5 obtener un elemento
Apilar Desapilar
Cima de
Los elementos se insertan de uno en uno (apilar) la pila
a3
Se sacan en el orden inverso al cual se han insertado
(desapilar) a2
El único elemento que se puede observar dentro de
la pila es el último insertado (cima) a1
Aplicaciones:
5 estructuras auxiliares en numerosos algoritmos y esquemas de programación:
recorridos de árboles y grafos
evaluación de expresiones
conversión entre notaciones de expresiones (postfija, prefija, infija)
espec pilas
usa booleanos
parámetro formal
género elemento
fpf Gen (pila) =
género pila
operaciones Cons (pila) =
creaPila: Æ pila Mod (pila) =
apilar: pila elemento Æ pila
parcial desapilar: pila Æ pila
parcial cima: pila Æ elemento
vacía?: pila Æ booleano
dominios de definición p: pila; e: elemento
Obs (pila) =
El conjunto de generadoras es libre, ya que cualquier término formado por las operaciones
generadoras denota siempre un valor distinto del TAD Pila
Los patrones necesarios para representar todas las posibles pilas se obtienen del conjunto
de las operaciones generadoras
5 creaPila: representa la pila sin ningún elemento (pila vacía)
5 apilar(p, e): representa cualquier pila con, al menos, un elemento
Interfaz informal
Paradigma TAD:
5 Es necesario especificar el tipo independientemente de su implementación
5 Una interfaz es una lista de métodos que cualquier implementación del tipo debe
proporcionar
Aunque C++ no soporta de forma adecuada la definición de interfaces, para cada tipo
presentaremos una interfaz informal
template <typename T>
Pila {
public:
Pila();
bool esVacia() const;
const T& cima() const throw(PilaVaciaExcepcion);
void apilar (const T& objeto);
void desapilar() throw(PilaVaciaExcepcion);
}
Consideraciones:
5 si la pila no está vacía, el elemento almacenado en elementos[indCima - 1] corresponde a
la cima de la pila
5 elementos[0] ≡ fondo de la pila
5 indCima = 0 ≡ pila vacía
Ventaja: todas las operaciones de la interfaz tienen un coste temporal constante O(1)
Inconvenientes:
5 reservar espacio de memoria para el máximo previsto de elementos
5 gestionar pila llena
• lanzar una excepción
• usar la clase vector de la STL
Será el constructor el que reserve el espacio necesario en función del tamaño especificado
como parámetro
PilaTabla(const PilaTabla& p)
var
int i;
fvar;
inicio
fin;
Ventajas:
5 todas las operaciones de la interfaz tienen un coste temporal constante ⇒ O(1)
5 no hay limitaciones de tamaño
Se define una clase Nodo, que representa a cada uno de los objetos que forman
la lista enlazada
Si se realiza una asignación entre dos variables de tipo puntero (ej., p = q), no se realiza una
copia del valor del tipo (p.e. una pila completa), sino que se duplica la forma de acceder a
ella
p 4 6 8
q 1 3 5
4 6 8
p
q 1 3 5
~PilaEnlazada()
inicio
mientras ⎤ esVacia() hacer
desapilar();
fmientras;
fin;
~PilaTabla()
inicio
liberar [ ] elementos;
fin;
Uso:
#include <stack>
// …
stack<tipo_base> p;
Operaciones básicas:
stack() constructor
stack(const stack&) constructor de copia
stack& operator=(const stack&) operador de asignación
bool empty() const esVacia
const tipo_base& top() const cima
void push(const tipo_base&) apilar
void pop() desapilar
2.3.1 Conceptos
Los elementos se añaden por el extremo final, y se eliminan por el extremo opuesto: frente
Aplicaciones
espec colas
usa booleanos
parámetro formal
género elemento
fpf
género cola
operaciones
creaCola: Æ cola
añadir: cola elemento Æ cola
parcial eliminar: cola Æ cola
parcial primero: cola Æ elemento
vacía?: cola Æ booleano
dominios de definición c: cola; e: elemento
...
2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 23
Tema 2 TAD Cola
Los patrones necesarios para representar todas las posibles colas se obtienen del conjunto
de las operaciones generadoras
creaCola: representa la cola sin ningún elemento (cola vacía)
añadir(c, e): representa cualquier cola con, al menos, un elemento
vacia? (creaCola) =
vacia? (añadir (c, e)) =
fespec
2.3.3 Implementación
Interfaz informal
Uso:
#include <queue>
// …
queue<tipo_base> c;
Operaciones básicas:
queue() constructor
queue(const queue&) constructor de copia
queue& operator=(const queue&) operador de asignación
bool empty() const esVacia
const tipo_base& front() const primero
void push(const tipo_base&) añadir
void pop() eliminar
vacía? (creaDC) =
vacía? (+izq (e, c)) =
fespec
Implementación
Interfaz informal
e1 e2 ... en
Ventajas:
5 todas las operaciones de la interfaz tiene un coste
Lista doblemente enlazada temporal constante ⇒ O(1)
e1 e2 ... en
Uso:
#include <deque>
El contenedor deque de la STL // …
deque<tipo_base> dc;
deque() constructor
deque(const deque&) constructor de copia
deque& operator=(const deque&) operador de asignación
bool empty() const esVacia
Operaciones básicas: const tipo_base& front() const observarIzq
const tipo_base& back() const observarDer
void push_front(const tipo_base&) añadirIzq
void push_back(const tipo_base&) añadirDer
void pop_front() eliminarIzq
void pop_back() eliminarDer
Suelen utilizarse como base para la construcción de otros TAD y estructuras de datos:
Existen diversas formas de generar las listas. En nuestro caso elegimos un conjunto de
operaciones pequeño y libre
Operaciones generadoras
[]
Gen (lista) =
+izq (e, l)
...
2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 42
Tema 2 TAD Lista
[]&l=
+izq (e, l1) & l2 =
long ([ ]) =
long (+izq (e, l)) =
está? (e, [ ]) =
está? (e1, +izq (e2, l)) =
insertar ([ ], i, e) =
insertar (+izq (e1, l), i, e2)) =
...
2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 43
Tema 2 TAD Lista
eliminar (+izq (e, l), i) =
fespec
La implementación más sencilla del TAD Lista es mediante una lista simplemente enlazada:
primero ultimo
e1 e2 ... en
esVacía eliminar
concatenar modificar
añadirDch observar
observarDch posición
eliminarDch
n ≡ longitud de la lista
principio (l) =
final (l) =
ponerIterador (l, n) =
La semántica del resto de las operaciones con iteradores (insertar, eliminar, modificar y
observar) se describe en función de las operaciones análogas con índices. Simplemente
se utiliza como índice el resultado de la operación posición (l, it)
Aunque tengan el mismo nombre, al tener parámetros distintos, entendemos que estamos
haciendo sobrecargas de operaciones
Como todos los tipos vistos hasta hora, los iteradores tienen una interfaz común,
independientemente del contenedor al que va a estar asociado
Sin embargo, su representación y la implementación de sus métodos dependerá de la
representación elegida para el contenedor (en este caso para la lista)
Con una implementación de lista simplemente enlazada, el iterador consiste en un puntero
al nodo anterior para que las operaciones de inserción y borrado sean eficientes. Además,
la lista debe tener un nodo centinela al principio para poder tratar al primer elemento
Lista
num primero último
e1 ... en
anterior
Iterador
En este gráfico vemos un iterador apuntando al elemento
e1. Este hecho representa, conceptualmente, al iterador
posicionado en el elemento e2
Hay que tener un especial cuidado con el uso de iteradores: se puede emplear un iterador
definido para una lista en operaciones con otra lista
Puede evitarse incluyendo un tratamiento de excepciones que compruebe que el iterador
pertenece a la lista con la que se quiere operar:
recorriendo la lista hasta encontrar el nodo al que apunta el iterador: O(n)
incluyendo en la implementación del iterador un puntero a la lista a la que pertenece: O(1)
Lista
num primero último
e1 ... en
lista anterior
Iterador
Operaciones básicas:
vector() constructor
vector(const vector&) constructor de copia
vector& operator=(const vector&) operador de asignación
bool empty() const esVacia Uso:
int size() const longitud #include <vector>
const tipo_base& operator[](int n) const observar
// …
void push_back(const T&) añadirDer
vector<tipo_base> v;
void pop_back() eliminarDer
iterator begin() devuelve un iterador al comienzo del vector
iterator end() devuelve un iterador al final del vector
iterator insert(iterator pos, inserta x delante de pos
const tipo_base& x)
iterator erase(iterator pos) elimina el elemento que ocupa la posición pos
Expresiones válidas: