Escolar Documentos
Profissional Documentos
Cultura Documentos
Algoritmos
Indice
Pilas
Colas
Listas
Algoritmos
Referencias bibliogracas
M. A. Weiss. Listas, pilas y colas. En Estructuras de datos y algoritmos, cap tulo 3, paginas 4592. Addison-Wesley Iberoamericana, 1995. Mar de estructuras de datos. En R. Pena . Implementacion de Programas. Formalismo y abstraccion , cap Diseno tulo 7, 1998. paginas 257290. Prentice Hall, segunda edicion, G. Brassard y T. Bratley. Estructura de datos. En Fundamentos de algoritmia, cap tulo 5, paginas 167210. Prentice Hall, 1997.
Algoritmos
Indice
Pilas
Colas
Listas
Algoritmos
Pilas
Acceso limitado al ultimo elemento insertado Operaciones basicas: apilar, desapilar y cima. desapilar o cima en una pila vac a es un error en el TDA pila. Quedarse sin espacio al apilar es un error de implementacion. deber Cada operacion a tardar una cantidad constante de tiempo en ejecutarse.
Con independencia del numero de elementos apiladas.
Algoritmos
Codigo C: pilas.h
#ifndef TAMANO_MAXIMO_PILA #define TAMANO_MAXIMO_PILA 10 #endif typedef int tipo_elemento; typedef struct { int cima; tipo_elemento vector[TAMANO_MAXIMO_PILA]; } pila; void crear_pila(pila *); int pila_vacia(pila); void apilar(tipo_elemento, pila *); tipo_elemento cima(pila); void desapilar(pila *); /* ERRORES: cima o desapilar sobre la pila vac a apilar sobre la pila llena */
Algoritmos Pilas, Colas, Listas
Indice
Pilas
Colas
Listas
Algoritmos
Colas
Operaciones basicas: insertar, quitarPrimero y primero. Cada rutina deber a ejecutarse en tiempo constante.
Algoritmos
Algoritmos
Algoritmos
a cabeza
Algoritmos
Algoritmos
a cabeza
nal d
Algoritmos
a cabeza
nal d
b cabeza
nal d
Algoritmos
a cabeza
nal d
b cabeza nal e
Algoritmos
nal d
b cabeza
Pilas, Colas, Listas
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
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
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 C.Vector_de_cola[C.Cabeza_de_cola] fin funci on
Algoritmos Pilas, Colas, Listas
Codigo C: colas.h
#ifndef TAMANO_MAXIMO_COLA #define TAMANO_MAXIMO_COLA 5 #endif typedef int tipo_elemento; typedef struct { int cabeza, final, tamano; tipo_elemento vector[TAMANO_MAXIMO_COLA]; } cola; void crear_cola(cola *); int cola_vacia(cola); void insertar(tipo_elemento, cola *); tipo_elemento quitar_primero(cola *); tipo_elemento primero(cola); /* ERRORES: quitar_primero o primero sobre una cola vac a insertar en una cola llena */
Algoritmos Pilas, Colas, Listas
tipo_elemento quitar_primero(cola *c) { tipo_elemento x; if (cola_vacia(*c)) { printf("error: cola vacia\n"); exit(EXIT_FAILURE); } c->tamano--; x = c->vector[c->cabeza]; incrementar(&(c->cabeza)); return x; }
Algoritmos
Indice
Pilas
Colas
Listas
Algoritmos
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
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 podr a exigir un tiempo cuadratico.
Algoritmos
p require una llamada a new y Insertar tras una posicion dos maniobras con apuntadores, O (1).
p podr Buscar la posicion a llevar tiempo lineal.
Algoritmos
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 simplica. La eliminacion
No es necesario buscar el elemento anterior.
Algoritmos
procedimiento Insertar ( x, L, p ) nuevo ( tmp ); { Inserta despu es de la posici on p } si tmp = nil entonces error Memoria agotada sino tmp.Elemento := x; tmp.Siguiente := p.Siguiente: p.Siguiente := tmp fin procedimiento
Algoritmos
Codigo C: listas.h
typedef int tipo_elemento; struct nodo { tipo_elemento elemento; struct nodo * siguiente; }; typedef struct nodo *pnodo; typedef pnodo lista; void crear_lista(lista *); int lista_vacia(lista); pnodo buscar(tipo_elemento, lista); int ultimo_elemento(pnodo); void eliminar(tipo_elemento, lista *); void insertar(tipo_elemento, lista *, pnodo); /* ERRORES: eliminar un elemento que no esta en la lista */
Algoritmos Pilas, Colas, Listas
void eliminar(tipo_elemento x, lista *l) { pnodo tmp, p = buscar_anterior(x, *l); if (ultimo_elemento(p)) { printf("no encontrado: %d\n", x); exit(EXIT_FAILURE); } tmp = p->siguiente; p->siguiente = tmp->siguiente; free(tmp); }
Algoritmos
void insertar(tipo_elemento x, lista *l, pnodo p) { pnodo tmp = (pnodo) malloc(sizeof(struct nodo)); if (tmp == NULL) { printf("memoria agotada\n"); exit(EXIT_FAILURE); } tmp->elemento = x; tmp->siguiente = p->siguiente; p->siguiente = tmp; }
Algoritmos
Algoritmos