Está en la página 1de 36

Pilas

Colas
Listas

Estructuras de datos: Pilas, Colas, Listas


Algoritmos

Facultad de Informatica

Universidad de A Coruna

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Table of Contents

Pilas

Pseudocodigo

Codigo J AVA

Colas

Pseudocodigo

Codigo
J AVA

Listas

Pseudocodigo

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Table of Contents

Pilas

Pseudocodigo

Codigo J AVA

Colas

Pseudocodigo

Codigo
J AVA

Listas

Pseudocodigo

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Pilas

Acceso limitado al ultimo


elemento insertado

Operaciones basicas:
apilar, desapilar y cima.
desapilar o cima en una pila vaca es un error en el TDA pila.

Quedarse sin espacio al apilar es un error de implementacion.


debera tardar una cantidad constante de tiempo
Cada operacion
en ejecutarse.
Con independencia del numero
de elementos apiladas.

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

a base de vectores (i)


Implementacion
tipo Pila = registro
Cima_de_pila : 0..Tama
no_m
aximo_de_pila
Vector_de_pila : vector [1..Tama
no_m
aximo_de_pila]
de Tipo_de_elemento
fin registro
procedimiento Crear Pila ( P )
P.Cima_de_pila := 0
fin procedimiento
funci
on Pila Vac
a ( P ) : test
devolver P.Cima_de_pila = 0
fin funci
on
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

a base de vectores (ii)


Implementacion
procedimiento Apilar ( x, P )
si P.Cima_de_pila = Tama
no_m
aximo_de_pila entonces
error Pila llena
sino
P.Cima_de_pila := P.Cima_de_pila + 1;
P.Vector_de_pila[P.Cima_de_pila] := x
fin procedimiento
funci
on Cima ( P ) : Tipo_de_elemento
si Pila Vac
a (P) entonces error Pila vac
a
sino devolver P.Vector_de_pila[P.Cima de Pila]
fin funci
on
procedimiento Desapilar ( P )
si Pila Vac
a (P) entonces error Pila vac
a
sino P.Cima_de_pila := P.Cima_de_pila - 1
fin procedimiento
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Codigo
J AVA: Interfaz Pila
BLICAS
// OPERACIONES PU
// void apilar(x) ->Inserta x
// void desapilar() ->Elimina el
ultimo elemento insertado
// Object cima() ->Devuelve el
ultimo elemento insertado
// boolean esVacia() ->Devuelve true si vac
a, sino false
// void vaciar() ->Elimina todos los elementos
// ERRORES: cima o desapilar sobre la pila vac
a
public interface IPila {
void apilar(Object x);
void desapilar() throws Exception;
Object cima() throws Exception;
boolean esVacia();
void vaciar();
}
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Codigo
J AVA: Clase PilaVec (i)
import java.util.*;
public class PilaVec implements IPila {
private Vector p;
private int cimaDePila;
static final int CAPACIDAD_POR_DEFECTO = 10;
public PilaVec() {
p = new Vector(CAPACIDAD_POR_DEFECTO);
cimaDePila = -1;
}
public boolean esVacia() {
return (cimaDePila == -1);
}
public void vaciar() {
cimaDePila = -1;
}
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Codigo
J AVA: Clase PilaVec (ii)
public void apilar(Object x) {
if (++cimaDePila == p.size()) p.add(x);
else p.set(cimaDePila, x);
}
public void desapilar() throws Exception {
if (esVacia()) throw new Exception("pila vac
a");
cimaDePila--;
}
public Object cima() throws Exception {
if (esVacia()) throw new Exception("pila vac
a");
return p.get(cimaDePila);
}
}
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Table of Contents

Pilas

Pseudocodigo

Codigo J AVA

Colas

Pseudocodigo

Codigo
J AVA

Listas

Pseudocodigo

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Colas

Operaciones basicas:
insertar, quitarPrimero y primero.
Cada rutina debera ejecutarse en tiempo constante.

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

circular a base de vectores (i)


Implementacion
circular devuelve cabeza y fin al principo del
La implementacion

vector cuando rebasan la ultima


posicion.

final
1) Crear Cola (C)
cabeza

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

circular a base de vectores (i)


Implementacion
circular devuelve cabeza y fin al principo del
La implementacion

vector cuando rebasan la ultima


posicion.

final
1) Crear Cola (C)
cabeza

2) Insertar en Cola (a,C)

final
a
cabeza

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

circular a base de vectores (i)


Implementacion
circular devuelve cabeza y fin al principo del
La implementacion

vector cuando rebasan la ultima


posicion.

final
1) Crear Cola (C)
cabeza

2) Insertar en Cola (a,C)

3) Insertar en Cola (b,C)

final
a
cabeza

a
cabeza
Algoritmos

final
b

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

circular a base de vectores (i)


Implementacion
4) Insertar en Cola (c,C)

a
cabeza

Algoritmos

Pilas, Colas, Listas

final
c

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

circular a base de vectores (i)


Implementacion
4) Insertar en Cola (c,C)

a
cabeza

final
c

5) Insertar en Cola (d,C)

a
cabeza

Algoritmos

Pilas, Colas, Listas

final
d

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

circular a base de vectores (i)


Implementacion
4) Insertar en Cola (c,C)

a
cabeza

final
c

5) Insertar en Cola (d,C)

a
cabeza

final
d

final
d

6) Quitar Primero (C)

b
cabeza

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

circular a base de vectores (i)


Implementacion
4) Insertar en Cola (c,C)

a
cabeza

final
c

5) Insertar en Cola (d,C)

a
cabeza

final
d

b
cabeza

final
d

b
cabeza

6) Quitar Primero (C)

7) Insertar en Cola (e,C)

final
e
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Pseudocodigo
(i)
tipo Cola = registro
Cabeza_de_cola, Final_de_cola: 1..Tama
no_m
aximo_de_cola
Tama
no_de_cola : 0..Tama
no_m
aximo_de_cola
Vector_de_cola : vector [1..Tama
no_m
aximo_de_cola]
de Tipo_de_elemento
fin registro
procedimiento Crear_Cola ( C )
C.Tama
no_de_cola := 0;
C.Cabeza_de_cola := 1;
C.Final_de_cola := Tama
no_m
aximo_de_cola
fin procedimiento
funci
on Cola_Vac
a ( C ) : test
devolver C.Tama
no_de_cola = 0
fin funci
on
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Pseudocodigo
(ii)
procedimiento incrementar ( x ) (* privado *)
si x = Tama
no_m
aximo_de_cola entonces x := 1
sino x := x + 1
fin procedimiento
procedimiento Insertar_en_Cola ( x, C )
si C.Tama
no_de_Cola = Tama
no_m
aximo_de_cola entonces
error Cola llena
sino
C.Tama
no_de_cola := C.Tama
no_de_cola + 1;
incrementar(C.Final_de_cola);
C.Vector_de_cola[C.Final_de_cola] := x;
fin procedimiento
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Pseudocodigo
(iii)
funci
on Quitar_Primero ( C ) : Tipo_de_elemento
si Cola_Vac
a ( C ) entonces
error Cola vac
a
sino
C.Tama
no_de_cola := C.Tama
no_de_cola - 1;
x := C.Vector_de_cola[C.Cabeza_de_cola];
incrementar(C.Cabeza_de_cola);
devolver x
fin funci
on
funci
on Primero ( C ) : Tipo_de_elemento
si Cola_Vac
a ( C ) entonces
error Cola vac
a
sino
devolver Vector_de_cola[C.Cabeza_de_cola]
fin funci
on
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Codigo
J AVA: Interfaz Cola

BLICAS
// OPERACIONES PU
// void insertar(x) -> Inserta x
// Object primero() -> Devuelve el primer elemento
// Object quitarPrimero() -> Devuelve y elimina el primer el
// boolean esVacia() -> Devuelve true si vac
a, si no false
// void vaciar() -> Elimina todos los elementos
// ERRORES: primer y quitarPrimero sobre una cola vac
a
public interface ICola {
void insertar(Object x);
Object primero() throws Exception;
Object quitarPrimero() throws Exception;
boolean esVacia();
void vaciar();
}
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Codigo
J AVA: Clase ColasVec (i)
public class ColaVec implements ICola {
private Object [] vector;
private int tamanoActual;
private int cabezaDeCola;
private int finalDeCola;
static final int CAPACIDAD_POR_DEFECTO = 10;
public ColaVec() {
vector = new Object[CAPACIDAD_POR_DEFECTO];
vaciar();
}
public void vaciar() {
tamanoActual = 0;
cabezaDeCola = 0;
finalDeCola = -1;
}
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Codigo
J AVA: Clase ColaVec (ii)
public boolean esVacia() {
return (tamanoActual == 0);
}
public Object primero() throws Exception {
if (esVacia()) throw new Exception("cola vac
a");
return vector[cabezaDeCola];
}
private int incrementar(int x) {
if (++x == vector.length)
x = 0;
return x;
}
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Codigo
J AVA: Clase ColaVec (iii)
public Object quitarPrimero() throws Exception {
if (esVacia())
throw new Exception("cola vac
a");
tamanoActual--;
Object valorDevuelto = vector[cabezaDeCola];
cabezaDeCola = incrementar(cabezaDeCola);
return valorDevuelto;
}
public void insertar(Object x) {
if (tamanoActual == vector.length)
duplicarCola();
finalDeCola = incrementar(finalDeCola);
vector[finalDeCola] = x;
tamanoActual++;
}
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

Codigo
J AVA: Clase ColaVec (iv)

private void duplicarCola() {


Object [] nuevoVector =
new Object[2*vector.length];
for (int i=0; i<tamanoActual; i++,
cabezaDeCola = incrementar(cabezaDeCola))
nuevoVector[i] = vector[cabezaDeCola];
vector = nuevoVector;
cabezaDeCola = 0;
finalDeCola = tamanoActual - 1;
}
}

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Codigo
J AVA

de la duplicacion
del vector
Amortizacion

se realiza
Cuando el vector no se duplica, toda operacion
en tiempo constante.
con duplicacion
es O (N ).
La complejidad de una insercion
de un vector de N elementos esta precedida,
La duplicacion
al menos, por N /2 inserciones que no duplican el vector.

Repartiendo el coste O (N ) de la duplicacion


entre las inserciones precedentes,
en una constante.
el coste de insertar aumenta solo

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Table of Contents

Pilas

Pseudocodigo

Codigo J AVA

Colas

Pseudocodigo

Codigo
J AVA

Listas

Pseudocodigo

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

Listas

Operaciones basicas:
Visualizar su contenido.
de la primera ocurrencia de un elemento.
Buscar la posicion

Insertar y Eliminar un elemento en alguna posicion.


Buscar k esimo, que devuelve el elemento
indicada
de la posicion

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

de listas a base de vectores


Implementacion

de la lista.
Tiene que declararse el tamano

Exige sobrevaloracion.
Consume mucho espacio.

Complejidad computacional de las operaciones:


Buscar k esimo, tiempo constante
Visualizar y Buscar, tiempo lineal.
Insertar y Eliminar son costosas.
Insertar o eliminar un elemento exige, en promedio,
desplazar la mitad de los valores, O (n).
de una lista o la eliminacion

La construccion

de todos sus elementos podra exigir un tiempo cuadratico.

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

de listas a base de apuntadores


Implementacion
Cada nodo apunta al siguiente; el ultimo
no apunta a nada.

La lista es un puntero al primer nodo (y al ultimo).

Complejidad computacional de las operaciones:


Visualizar y Buscar, tiempo lineal.
Buscar k esimo, tiempo lineal.
Eliminar realiza un cambio de apuntadores y
una orden dispose, O (1).
es lineal.
Usa Buscar anterior cuyo tiempo de ejecucion

p require una llamada a new y


Insertar tras una posicion
dos maniobras con apuntadores, O (1).
p podra llevar tiempo lineal.
Buscar la posicion

y la eliminacion
al comienzo
Un nodo cabecera facilita la insercion
de la lista.

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

de listas doblemente enlazadas


Implementacion

Cada nodo apunta al siguiente y al anterior.


Duplica el uso de la memoria necesaria para los punteros.
Duplica el coste de manejo de punteros al insertar y eliminar.
se simplifica.
La eliminacion
No es necesario buscar el elemento anterior.

Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

con un nodo cabecera (i)


Implementacion
tipo PNodo = puntero a Nodo
Lista = PNodo
Posici
on = PNodo
Nodo = registro
Elemento : Tipo_de_elemento
Siguiente : PNodo
fin registro
procedimiento Crear Lista ( L )
nuevo ( tmp );
si tmp = nil entonces error Memoria agotada
sino
tmp.Elemento := { nodo cabecera };
tmp.Siguiente := nil;
L := tmp
fin procedimiento
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

con un nodo cabecera (ii)


Implementacion
funci
on Lista Vac
a ( L ) : test
devolver L.Siguiente = nil
fin funci
on
funci
on Buscar ( x, L ) : posici
on de la 1a ocurrencia
o nil
p := L.Siguiente;
mientras p <> nil y p.Elemento <> x hacer
p := p.Siguiente;
devolver p
fin funci
on
funci
on
Ultimo Elemento ( p ) : test { privada }
devolver p.Siguiente = nil
fin funci
on
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

con un nodo cabecera (iii)


Implementacion
funci
on Buscar Anterior ( x, L ) : posici
on anterior a x
o a nil { privada }
p := L;
mientras p.Siguiente <> nil y
p.Siguiente.Elemento <> x hacer
p := p.Siguiente;
devolver p
fin funci
on
procedimiento Eliminar ( x, L )
p := Buscar Anterior ( x, L );
si
Ultimo Elemento ( p ) entonces error No encontrado
sino tmp := p.Siguiente;
p.Siguiente := tmp.Siguiente;
liberar ( tmp )
fin procedimiento
Algoritmos

Pilas, Colas, Listas

Pilas
Colas
Listas

Pseudocodigo

con un nodo cabecera (iv)


Implementacion

procedimiento Insertar ( x, L, p )
es de la posici
on p }
nuevo ( tmp );
{ Inserta despu
si tmp = nil entonces
error Memoria agotada
sino
tmp.Elemento := x;
tmp.Siguiente := p.Siguiente:
p.Siguiente := tmp
fin procedimiento

Algoritmos

Pilas, Colas, Listas

También podría gustarte