Listas, pilas y colas

42
Listas, Pilas y Colas Edison Sepúlveda 10-1010

Transcript of Listas, pilas y colas

Page 1: Listas, pilas y colas

Listas, Pilas y Colas

Edison Sepúlveda

10-1010

Page 2: Listas, pilas y colas

Lista (estructura de datos)

• En Ciencias de la Computación, una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias (punteros) al nodo anterior o posterior. El principal beneficio de las listas enlazadas respecto a los array convencionales es que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento.

Page 3: Listas, pilas y colas

Lista (estructura de datos)

• Una lista enlazada es un tipo de dato auto-referenciado porque contienen un puntero o link a otro dato del mismo tipo. Las listas enlazadas permiten inserciones y eliminación de nodos en cualquier punto de la lista en tiempo constante (suponiendo que dicho punto está previamente identificado o localizado), pero no permiten un acceso aleatorio. Existen diferentes tipos de listas enlazadas: Lista Enlazadas Simples, Listas Doblemente Enlazadas, Listas Enlazadas Circulares y Listas Enlazadas Doblemente Circulares.

Page 4: Listas, pilas y colas

Lista (estructura de datos)

• Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales como Lisp y Scheme tiene estructuras de datos ya construidas, junto con operaciones para acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales como C o C++ y Java, respectivamente, disponen de referencias para crear listas enlazadas.

Page 5: Listas, pilas y colas

Pila

• Una pila (stack en inglés) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In First Out, último en entrar, primero en salir) que permite almacenar y recuperar datos. Esta estructura se aplica en multitud de ocasiones en el área de informática debido a su simplicidad y ordenación implícita de la propia estructura.

Page 6: Listas, pilas y colas

Pila

• Para el manejo de los datos se cuenta con dos operaciones básicas: apilar (push), que coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el último elemento apilado.

Page 7: Listas, pilas y colas

Pila

• En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al último objeto apilado (denominado TOS, Top of Stack en inglés).

• La operación retirar permite la obtención de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS.

Page 8: Listas, pilas y colas

Pila

• Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato sobre una pila de platos, y una operación retirar a retirarlo.

Page 9: Listas, pilas y colas

Pila

Las pilas suelen emplearse en los siguientes contextos:

• Evaluación de expresiones en notación postfija (notación polaca inversa).

• Reconocedores sintácticos de lenguajes independientes del contexto

• Implementación de recursividad.

Page 10: Listas, pilas y colas

Cola

• Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir.

Page 11: Listas, pilas y colas

Cola

• Las colas se utilizan en sistemas informáticos, transportes y operaciones de investigación (entre otros), dónde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas.

Page 12: Listas, pilas y colas

Diferencias entre pila y cola

• La pila es un sistema LIFO (Last In First Out), osea lo que entra de ultimo a la lista sera lo primero en salir, mientras que la cola es un FIFO (First In First Out) en la que lo primero en entrar sera lo primero en salir.

Page 13: Listas, pilas y colas

Operaciones basicas de una lista.

• Recorrer los elementos hacia adelante• Recorrer los elementos hacia atras• Insertar un nuevo elemento al principio• Insertar un nuevo elemento al final• Insertar un nuevo elemento antes de otro• Insertar un nuevo elemento despues de otro• Remover un elemento del principio• Remover un elemento que esta antes que otro• Remover un elemento que esta despues de otro• Remover un elemento del principio• Remover un elemento del final

Page 14: Listas, pilas y colas

Diferencia entre estruturas estaticas y dinamicas

• Las estructuras de datos estáticas:

• Son aquellas en las que el tamaño ocupado en memoria se define antes de que el programa se ejecute y no puede modificarse dicho tamaño durante la ejecución del programa.

Page 15: Listas, pilas y colas

Diferencia entre estruturas estaticas y dinamicas

• Estas estructuras están implementadas en casi todos los lenguajes.

• Su principal característica es que ocupan solo una casilla de memoria, por lo tanto una variable simple hace referencia a un único valor a la vez, dentro de este grupo de datos se encuentra: enteros, reales, caracteres, boléanos, enumerados y subrangos (los últimos no existen en algunos lenguajes de programación)

Page 16: Listas, pilas y colas

Diferencia entre estruturas estaticas y dinamicas

• Las estructuras de datos dinámicas:

• No tienen las limitaciones o restricciones en el tamaño de memoria ocupada que son propias de las estructuras estáticas.

Page 17: Listas, pilas y colas

Diferencia entre estruturas estaticas y dinamicas

• Mediante el uso de un tipo de datos especifico, denominado puntero, es posible construir estructuras de datos dinámicas que no son soportadas por la mayoría de los lenguajes, pero que en aquellos que si tienen estas características ofrecen soluciones eficaces y efectivas en la solución de problemas complejos.

Page 18: Listas, pilas y colas

Diferencia entre estruturas estaticas y dinamicas

• Se caracteriza por el hecho de que con un nombre se hace referencia a un grupo de casillas de memoria. Es decir un dato estructurado tiene varios componentes.

Page 19: Listas, pilas y colas

Implementación de una lista enlazada en C

• #include <stdio.h> /* for printf */• #include <stdlib.h> /* for malloc */• • typedef struct ns {• int data;• struct ns *next;• } node;• • node *list_add(node **p, int i) {• /* algunos compiladores no requieren un casting del valor del retorno para malloc

*/• node *n = (node *)malloc(sizeof(node));• if (n == NULL)• return NULL;• n->next = *p; • *p = n;• n->data = i;

Page 20: Listas, pilas y colas

Implementación de una lista enlazada en C

• return n;• }• • void list_remove(node **p) { /* borrar cabeza*/• if (*p != NULL) {• node *n = *p;• *p = (*p)->next;• free(n);• }• }• • node **list_search(node **n, int i) {• while (*n != NULL) {• if ((*n)->data == i) {• return n;• }

Page 21: Listas, pilas y colas

Implementación de una lista enlazada en C

• n = &(*n)->next;• }• return NULL;• }• • void list_print(node *n) {• if (n == NULL) {• printf("lista esta vacía\n");• }• while (n != NULL) {• printf("print %p %p %d\n", n, n->next, n->data);• n = n->next;• }• }• • int main(void) {

Page 22: Listas, pilas y colas

Implementación de una lista enlazada en C

• node *n = NULL;• • list_add(&n, 0); /* lista: 0 */• list_add(&n, 1); /* lista: 1 0 */• list_add(&n, 2); /* lista: 2 1 0 */• list_add(&n, 3); /* lista: 3 2 1 0 */• list_add(&n, 4); /* lista: 4 3 2 1 0 */• list_print(n);• list_remove(&n); /* borrar primero(4) */• list_remove(&n->next); /* borrar nuevo segundo (2) */• list_remove(list_search(&n, 1)); /* eliminar la celda que contiene el 1 (primera) */• list_remove(&n->next); /* eliminar segundo nodo del final(0)*/• list_remove(&n); /* eliminar ultimo nodo (3) */• list_print(n);• • return 0;• }

Page 23: Listas, pilas y colas

Colas en C++

• #ifndef COLA• #define COLA // Define la cola• template <class T>• class Cola{• private:• struct Nodo{• T elemento;• struct Nodo* siguiente; // coloca el nodo en la

segunda posición• }* primero;• struct Nodo* ultimo;

Page 24: Listas, pilas y colas

Colas en C++

• unsigned int elementos;• public:• Cola(){• elementos = 0;• }• ~Cola(){• while (elementos != 0) pop();• }• void push(const T& elem){• Nodo* aux = new Nodo;• aux->elemento = elem;

Page 25: Listas, pilas y colas

Colas en C++

• if (elementos == 0) primero = aux;• else ultimo->siguiente = aux;• ultimo = aux;• ++elementos;• }• void pop(){• Nodo* aux = primero;• primero = primero->siguiente;• delete aux;• --elementos;• }

Page 26: Listas, pilas y colas

Colas en C++

• T consultar() const{• return primero->elemento;• }• bool vacia() const{• return elementos == 0;• }• unsigned int size() const{• return elementos;• }• };• #endif

Page 27: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• #include<stdio.h>• #include<conio.h>• • #define TAM 6• #define MAX TAM-1• • typedef struct• {• int tope;• int item[TAM];

Page 28: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• }pila;• • • int full(pila *);• int empty(pila *);• void push(pila *, int);• void pop(pila *,int *);• • • void main()

Page 29: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• {• pila p,t;• int dato,opc,elemento,flag=0;• p.tope=0;• do• {• clrscr();• printf("\nMENU-PILA");• printf("\n1-> Insertar elemento");• printf("\n2-> Eliminar elemento");

Page 30: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• printf("\n3-> Eliminar elemento X");• printf("\n4-> Visualizar");• printf("\n5-> Salir");• printf("\n\nDe su opci¢n : ");• scanf("%d",&opc);• switch(opc)• {• case 1:• if(!full(&p)) // si pila no esta llena• {• printf("\nDe el elemento a insertar: ");

Page 31: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• scanf("%d",&dato);• push(&p,dato);• printf("\nElemento insertado...");• }• else• {• printf("\nERROR: Pila llena");• }• break;•

Page 32: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• case 2:• if(!empty(&p))• {• pop(&p,&dato);• printf("\nEl elemento eliminado es %d",dato);• }• else• {• printf("\nERROR: Pila vac¡a");• }• break;

Page 33: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• • case 3:• if(!empty(&p))• {• printf("eliminar elemento seleccionado: ");• scanf("%d",&elemento);• • if(p.tope != 1){• t.tope=0;• do

Page 34: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• {• pop(&p,&dato);• if (dato != elemento)• { • push(&t,dato);• } • }while(!empty(&p));• • do• {• pop(&t,&dato);

Page 35: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• push(&p,dato);• }while(!empty(&t));• }• else if(dato == elemento){pop(&p,&dato);}• else {printf("el elemento no se encuentra en la

pila");}• }• else• {• printf("\nERROR: Pila vac¡a");• }

Page 36: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• break;• • • case 4:• if(!empty(&p))• {• t.tope=0;• do• {• pop(&p,&dato);• printf("\n%d",dato);

Page 37: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• push(&t,dato);• }while(!empty(&p));• do• {• pop(&t,&dato);• push(&p,dato);• }while(!empty(&t));• }• else• {

Page 38: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• printf("\nERROR: Pila vac¡a");• }• break;• case 5:• flag=1;• break;• case 6:• flag=0;• break;• • default:

Page 39: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• printf("\nOpci¢n no v lida...");• }• if(!flag)• {• printf("\n\nPresione una tecla para continuar...");• getch();• }• }while(!flag);• • }

Page 40: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• • int full(pila *p)• {• return(p->tope==MAX);• }• • int empty(pila *p)• {• return(p->tope==0);• }•

Page 41: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• void push(pila *p,int dato)• {• if(!full(p))• {• (p->tope)++;• p->item[p->tope]=dato; //elemento[1]=dato• }• else• printf("\nOVERFLOW");• }

Page 42: Listas, pilas y colas

PILA CON PUNTEROS EN C++

• • void pop(pila *p,int *dato)• {• if(!empty(p))• {• *dato=p->item[p->tope];• (p->tope)--;• }• else• printf("\nUNDERFLOW");• }