Estructuras de datos: Pilas, Colas, Listas



Documentos relacionados
Estructuras de datos: Pilas, Colas, Listas

Estructuras de datos: Pilas, Colas, Listas

UNIVERSIDAD AUTONOMA DE MADRID ESCUELA POLITÉCNICA SUPERIOR ESTRUCTURAS DE DATOS Y ALGORITMOS

LISTAS ENLAZADAS FUNDAMENTOS TEORICOS

Estructuras de datos: Árboles binarios de

Tipos de Datos Abstractos TDA COLA. Representación de una cola

Estructuras de datos: Árboles binarios de

Estructura de Datos. Pilas Colas. Primer Semestre, Indice. TDA: Pilas TDA: Colas Colas de Prioridad Anillos BiColas BiColas Circulares

ELO320 Estructuras de Datos y Algoritmos. Listas. Tomás Arredondo Vidal

Tema 2: Clases y Objetos

Tema 8. Listas. José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz

Notas de estructura de datos con lenguaje C. Estructuras de datos dinámicas

Este material es de uso exclusivo para estudio, los textos fueron tomados textualmente de varios libros por lo que está prohibida su impresión y

6. El TDA Lista Implementación con listas enlazadas. es de tipo genérico T. Pueden existir elementos repetidos (a diferencia de los conjuntos).

Capitulo V Listas Enlazadas

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

Estructura de datos Colas

Estructura de datos y algoritmos. Tema IV: TIPOS DE DATOS ABSTRACTOS DINÁMICOS LINEALES

Estructuras de Datos

Estructura de Datos L I S T A

Capítulo. Listas, pilas y colas en C++ Contenido. Introducción

UNIVERSIDAD AUTONOMA DEL ESTADO DE MEXICO CENTRO UNIVERSITARIO UAEM ATLACOMULCO ESTRUCTURAS DE DATOS ING. GREGORIO GARCIA ESTRADA INTEGRANTES:

IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++

Programación TADs Lineales Lista Pila Cola

Universidad Autónoma del Estado de México 2016, Año del 60 Aniversario de la Universidad Autónoma del Estado de México

4. Pilas ESTRUCTURAS DE DATOS 1

Tipos de Datos Abstractos (TDA)

Realizar el ejercicio anterior utilizando Punteros

Capítulo. Listas, pilas y colas en C. Contenido. Introducción

ESTRUCTURAS DINÁMICAS DE DATOS (COLAS) EN C

12. COLAS Introducción Fundamentos

13. LISTAS Introducción Listas con punto de interés

ESTRUCTURAS DINÁMICAS DE DATOS (LISTAS)

Tema 4. Estructuras Dinámicas

Estructuras de Datos Dinámicas

Solución práctico 6 Tipos Abstractos de Datos Lista, Pila y Cola

Estructuras Enlazadas AyED UTN-BA

LISTAS. Prof. Ing. M.Sc. Fulbia Torres

Cursos Propedéuticos 2015

12. LISTAS Introducción Listas con punto de interés

Estructuras de datos: Tablas de dispersión

Ingeniera de Sistemas: Luz Esperanza Espitia Tutora de Estructura de datos.

ESTRUCTURAS DINÁMICAS DE DATOS (PILAS)

Estructuras de Datos y Algoritmos

Definición de árbol. Árboles

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Estructura de Datos. Centro Universitario UAEM Valle de México. Unidad II. Estructuras de Datos Lineales - Listas

ESTRUCTURAS DINÁMICAS DE DATOS (LISTAS)

Estructura de Datos Tema 6. Árboles. Contenido 14/06/2018

Unidad Nº V Listas Enlazadas

Segundo Parcial de Programación 2 7 de junio de 2017

Estructura de Datos: Lista. Facultad Ingeniería y Tecnología Informática Tecnicatura en Programación de Computadoras. Autora: Prof.

Biblioteca de templates. template <typename T> void eliminar(t arr[], int& len, int pos);

324 MR Versión 1 Prueba Integral 1/3 Semana 10 Lapso

Tema 5. Tipos Abstractos de Datos

GESTIÓN DE MEMORIA DINÁMICA

Estructuras de Datos Clase 4 Pilas y colas

Lista Simple con Puntero al Principio y Puntero al Final

Estructuras Dinámicas

Estructuras de Datos Dinámicas: Listas

TEMA 2 Estructuras de datos lineales

Estructura de Datos Tema 2. Colas. Contenido

ELO320 Estructuras de Datos y Algoritmos. Stacks y Colas. Tomás Arredondo Vidal

Tema 7. Colas. José M. Badía, Begoña Martínez, Antonio Morales y José M. Badía. {badia, bmartine,

Tema 6.2: Programación de Sistemas en Tiempo Real

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010

11. PILAS Introducción Fundamentos

Estructura de Datos. Temario Unidad VI. Árboles Árboles Binarios

Departamento de Informática Universidad de Valladolid Campus de Segovia TEMA 3: ESTRUCTURAS DINÁMICAS LINEALES. LISTAS ENLAZADAS, PILAS Y COLAS

Estructuras de Datos. 14 de junio de Apellidos

Estructura de Datos. TDA: Listas. Primer Semestre, Indice. Tipos de estructura de datos lineales

Estructura de Datos y de la Información

Tema 4- Representación Enlazada

Árboles. Árboles. Árboles binarios de búsqueda. Árboles. Inserción en un árbol. Árbol binario de búsqueda

1 Introducción a los algoritmos y a la programación de computadoras... 1

LISTAS CIRCULARES. // Métodos private CElemento() {} // constructor. ultimo

Tema 04: TAD Lista. M. en C. Edgardo Adrián Franco Martínez edgardoadrianfrancom

Tablas de Dispersión (Hashing Tables)

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

ESTRUCTURAS DE DATOS TEORÍA 2016/2017 PILAS

Estructuras de datos Solemne 2

ESTRUCTURAS DINÁMICAS DE DATOS (PILAS) EN C

Contenido PARTE II: ESTRUCTURAS DE DATOS AVANZADAS

Estructuras dinámicas lineales (ii)

Implementaciones de pilas, colas y afines. Memoria dinámica.

Estructura de Datos. Listas Enlazadas

TAD Lineales: Pila, Cola y Lista

Universidad Centroccidental "Lisandro Alvarado" Decanato de Ciencias y Tecnología Departamento de

Implementación de las Clases Pila, Cola, Lista y Arbol

EJERCICIOS PARA EL PRIMER PARCIAL (de exámenes pasados)

Tipos de Datos Abstractos

TAD CONJUNTOS Y MULTICONJUNTOS

Unidad III: Estructuras lineales

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

11. PILAS Introducción Fundamentos

(1) Recordemos qué es una pila...

Transcripción:

Estructuras de datos: Dep. de Computación - Fac. de Informática Universidad de A Coruña Santiago Jorge santiago.jorge@udc.es

Índice Pilas 1 Pilas 2 3

Referencias bibliográficas Pilas M. A. Weiss., pilas y colas. En Estructuras de datos y algoritmos, capítulo 3, páginas 45 92. Addison-Wesley Iberoamericana, 1995. R. Peña Marí. Implementación de estructuras de datos. En Diseño de Programas. Formalismo y abstracción, capítulo 7, páginas 257 290. Prentice Hall, segunda edición, 1998. G. Brassard y T. Bratley. Estructura de datos. En Fundamentos de algoritmia, capítulo 5, páginas 167 210. Prentice Hall, 1997.

Índice Pilas 1 Pilas 2 3

Pilas Acceso limitado al último elemento insertado Operaciones básicas: 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 implementación. Cada operación debería tardar una cantidad constante de tiempo en ejecutarse. Con independencia del número de elementos apiladas.

Pseudocódigo: Implementación a base de vectores (i) tipo Pila = registro Cima_de_pila : 0..Tamaño_máximo_de_pila Vector_de_pila : vector [1..Tamaño_máximo_de_pila] de Tipo_de_elemento fin registro procedimiento Crear Pila ( P ) P.Cima_de_pila := 0 fin procedimiento función Pila Vacía ( P ) : test devolver P.Cima_de_pila = 0 fin función

Pseudocódigo: Implementación a base de vectores (ii) procedimiento Apilar ( x, P ) si P.Cima_de_pila = Tamaño_máximo_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ón 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ón 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

Código C: pilas.h Pilas #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 */

Código C: pilas.c (i) #include <stdlib.h> #include <stdio.h> #include "pilas.h" void crear_pila(pila *p) { p->cima = -1; int pila_vacia(pila p) { return (p.cima == -1); void apilar(tipo_elemento x, pila *p) { if (++p->cima == TAMANO_MAXIMO_PILA) { printf("error: pila llena\n"); exit(exit_failure); p->vector[p->cima] = x;

Código C: pilas.c (ii) Pilas tipo_elemento cima(pila p) { if (pila_vacia(p)) { printf("error: pila vacia\n"); exit(exit_failure); return p.vector[p.cima]; void desapilar(pila *p) { if (pila_vacia(*p)) { printf("error: pila vacia\n"); exit(exit_failure); p->cima--;

Índice Pilas 1 Pilas 2 3

Pilas Operaciones básicas: insertar, quitarprimero y primero. Cada rutina debería ejecutarse en tiempo constante.

Implementación circular a base de vectores (i) La implementación circular devuelve cabeza y fin al principo del vector cuando rebasan la última posición. 1) Crear Cola (C) cabeza final

Implementación circular a base de vectores (i) La implementación circular devuelve cabeza y fin al principo del vector cuando rebasan la última posición. 1) Crear Cola (C) cabeza final final 2) Insertar en Cola (a,c) a cabeza

Implementación circular a base de vectores (i) La implementación circular devuelve cabeza y fin al principo del vector cuando rebasan la última posición. 1) Crear Cola (C) cabeza final final 2) Insertar en Cola (a,c) a cabeza final 3) Insertar en Cola (b,c) a b cabeza

Implementación circular a base de vectores (i) final 4) Insertar en Cola (c,c) a b c cabeza

Implementación circular a base de vectores (i) final 4) Insertar en Cola (c,c) a b c cabeza final 5) Insertar en Cola (d,c) a b c d cabeza

Implementación circular a base de vectores (i) final 4) Insertar en Cola (c,c) a b c cabeza final 5) Insertar en Cola (d,c) a b c d cabeza final 6) Quitar Primero (C) b c d cabeza

Implementación circular a base de vectores (i) final 4) Insertar en Cola (c,c) a b c cabeza final 5) Insertar en Cola (d,c) a b c d cabeza final 6) Quitar Primero (C) b c d cabeza final 7) Insertar en Cola (e,c) e b c d cabeza

Pseudocódigo (i) Pilas tipo Cola = registro Cabeza_de_cola, Final_de_cola: 1..Tamaño_máximo_de_cola Tamaño_de_cola : 0..Tamaño_máximo_de_cola Vector_de_cola : vector [1..Tamaño_máximo_de_cola] de Tipo_de_elemento fin registro procedimiento Crear_Cola ( C ) C.Tamaño_de_cola := 0; C.Cabeza_de_cola := 1; C.Final_de_cola := Tamaño_máximo_de_cola fin procedimiento función Cola_Vacía ( C ) : test devolver C.Tamaño_de_cola = 0 fin función

Pseudocódigo (ii) Pilas procedimiento incrementar ( x ) (* privado *) si x = Tamaño_máximo_de_cola entonces x := 1 sino x := x + 1 fin procedimiento procedimiento Insertar_en_Cola ( x, C ) si C.Tamaño_de_Cola = Tamaño_máximo_de_cola entonces error Cola llena sino C.Tamaño_de_cola := C.Tamaño_de_cola + 1; incrementar(c.final_de_cola); C.Vector_de_cola[C.Final_de_cola] := x; fin procedimiento

Pseudocódigo (iii) función Quitar_Primero ( C ) : Tipo_de_elemento si Cola_Vacía ( C ) entonces error Cola vacía sino C.Tamaño_de_cola := C.Tamaño_de_cola - 1; x := C.Vector_de_cola[C.Cabeza_de_cola]; incrementar(c.cabeza_de_cola); devolver x fin función función 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ón

Código C: colas.h Pilas #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 */

Código C: colas.c (i) #include <stdlib.h> #include <stdio.h> #include "colas.h" void crear_cola(cola *c) { c->tamano = 0; c->cabeza = 0; c->final = -1; int cola_vacia(cola c) { return (c.tamano == 0); void incrementar(int *x) { /* privado */ if (++(*x) == TAMANO_MAXIMO_COLA) *x = 0;

Código C: colas.c (ii) void insertar(tipo_elemento x, cola *c) { if (c->tamano == TAMANO_MAXIMO_COLA) { printf("error: cola llena: %d\n", c->tamano); exit(exit_failure); c->tamano++; incrementar(&(c->final)); c->vector[c->final] = x; tipo_elemento primero(cola c) { if (cola_vacia(c)) { printf("error: cola vacia\n"); exit(exit_failure); return(c.vector[c.cabeza]);

Código C: colas.c (iii) Pilas 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;

Índice Pilas 1 Pilas 2 3

Pilas Operaciones básicas: Visualizar su contenido. Buscar la posición de la primera ocurrencia de un elemento. Insertar y Eliminar un elemento en alguna posición. Buscar k esimo, que devuelve el elemento de la posición indicada

Implementación de listas a base de vectores Tiene que declararse el tamaño de la lista. Exige sobrevaloración. 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). La construcción de una lista o la eliminación de todos sus elementos podría exigir un tiempo cuadrático.

Implementación de listas a base de apuntadores Cada nodo apunta al siguiente; el último no apunta a nada. La lista es un puntero al primer nodo (y al último). 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). Usa Buscar anterior cuyo tiempo de ejecución es lineal. Insertar tras una posición p require una llamada a new y dos maniobras con apuntadores, O(1). Buscar la posición p podría llevar tiempo lineal. Un nodo cabecera facilita la inserción y la eliminación al comienzo de la lista.

Implementación de listas doblemente enlazadas 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. La eliminación se simplifica. No es necesario buscar el elemento anterior.

Pseudocódigo: Implementación con un nodo cabecera (i) tipo PNodo = puntero a Nodo Lista = PNodo Posición = 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

Pseudocódigo: Implementación con un nodo cabecera (ii) función Lista Vacía ( L ) : test devolver Lˆ.Siguiente = nil fin función función Buscar ( x, L ) : posición de la 1 a ocurrencia o nil p := Lˆ.Siguiente; mientras p <> nil y pˆ.elemento <> x hacer p := pˆ.siguiente; devolver p fin función función Último Elemento ( p ) : test { privada devolver pˆ.siguiente = nil fin función

Pseudocódigo: Implementación con un nodo cabecera (iii) función Buscar Anterior ( x, L ) : posición 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ón procedimiento Eliminar ( x, L ) p := Buscar Anterior ( x, L ); si Último Elemento ( p ) entonces error No encontrado sino tmp := pˆ.siguiente; pˆ.siguiente := tmpˆ.siguiente; liberar ( tmp ) fin procedimiento

Pseudocódigo: Implementación con un nodo cabecera (iv) procedimiento Insertar ( x, L, p ) nuevo ( tmp ); { Inserta después de la posición p si tmp = nil entonces error Memoria agotada sino tmpˆ.elemento := x; tmpˆ.siguiente := pˆ.siguiente: pˆ.siguiente := tmp fin procedimiento

Código C: listas.h (i) Pilas struct nodo { void *elem; /* void * es un apuntador generico */ struct nodo *sig; ; typedef struct nodo *posicion; typedef struct nodo *lista; lista crearlista(); int eslistavacia(lista l); void insertar(void *e, posicion p); /*inserta e tras el nodo apuntado por p*/ posicion buscar(lista l, void *e, int (*comp)(const void *x, const void *y)); /*la función comp devuelve un número mayor, igual o menor que cero, según x sea mayor, igual, o menor que y*/

Código C: listas.h (ii) Pilas void borrar(lista l, void *e, int (*comp)(const void *x, const void *y)); posicion primero(lista l); posicion siguiente(posicion p); int esfindelista(posicion p); void *elemento(posicion p); /* Para recorrer los elementos de la lista: for(p=primero(l);!esfindelista(p); p=siguiente(p)) { //hacer algo con elemento(p) */

Código C: listas.c (i) #include <stdlib.h> #include <stdio.h> #include "listas.h" static struct nodo *crearnodo(){ struct nodo *tmp = malloc(sizeof(struct nodo)); if (tmp == NULL) { printf("memoria agotada\n"); exit(exit_failure); return tmp; lista crearlista(){ struct nodo *l = crearnodo(); l->sig = NULL; return l;

Código C: listas.c (ii) int eslistavacia(lista l){ return (l->sig == NULL); void insertar(void *x, posicion p) { struct nodo *tmp = crearnodo(); tmp->elem = x; tmp->sig = p->sig; p->sig = tmp; posicion buscar(lista l, void *e, int (*comp)(const void *x, const void *y)){ struct nodo *p = l->sig; while (p!= NULL && 0!=(*comp)(p->elem, e)) p = p->sig; return p;

Código C: listas.c (iii) Pilas static posicion buscarant(lista l, void *x, int (*comp)(const void *, const void *)) { struct nodo *p = l; while (p->sig!= NULL && 0!=(*comp)(p->sig->elem, x)) p = p->sig; return p; static int esultimoelemento(struct nodo *p) { return (p->sig == NULL);

Código C: listas.c (iv) Pilas void borrar(lista l, void *x, int (*comp)(const void *, const void *)) { struct nodo *tmp, *p = buscarant(l, x, comp); if (!esultimoelemento(p)) { tmp = p->sig; p->sig = tmp->sig; free(tmp); posicion primero(lista l) { return l->sig; posicion siguiente(posicion p) { return p->sig; int esfindelista(posicion p) { return (p==null); void *elemento(posicion p) { return p->elem;