Tema Tema7: 7: Estructuras Estructurasde dedatos. datos. Colas ColasyyPilas Pilas Fundamentos de Informática 1º Ingeniería Industrial Escuela Superior de Ingenieros Universidad de Sevilla Ismael Alcalá Torrego José Ángel Acosta Rodríguez Fernando Dorado Navas Fabio Gómez Estern-Aguilar Manuel López Martínez Amparo Núñez Reyes Carlos Vivas Venegas TEMA TEMA7: 7: Estructuras Estructurasde dedatos datos ESTRUCTURAS DE DATOS = INFORMACIÓN Hasta ahora sabemos almacenar la información en variables individuales o tablas (de tipos de dato estándar o estructuras) + REGLAS DE ACCESO Ciertos problemas no admiten solución sencilla o eficiente con esta aproximación (Limitaciones) 1.- Tamaño estático Las Lasestructuras estructurasde dedatos datosdisponibles disponiblesen enCCno nopueden puedencambiar cambiarde de tamaño tamañoen entiempo tiempode deejecución. ejecución. Por Porejemplo, ejemplo,una unatabla tablade dedatos datostiene tieneun unnúmero númerode deelementos elementosfijo fijoque que no puede cambiarse una vez declarada. no puede cambiarse una vez declarada. Incluso Inclusoempleando empleandoreserva reservadinámica, dinámica,una unavez vezreservada reservadalalamemoria, memoria,elel número númerode deelementos elementoses esinvariable. invariable. Hay Hayaplicaciones aplicacionesque querequieren requierenesta estapropiedad: propiedad: Ej: Ej:Bases Basesde dedatos datos(el (elnúmero númerode deelementos elementosno noes esconocido conocidoen entiempo tiempo de ejecución y no es calculable con antelación. de ejecución y no es calculable con antelación. TEMA TEMA7: 7: Estructuras Estructurasde dedatos datos ESTRUCTURAS DE DATOS = INFORMACIÓN Hasta ahora sabemos almacenar la información en variables individuales o tablas (de tipos de dato estándar o estructuras) + REGLAS DE ACCESO Ciertos problemas no admiten solución sencilla o eficiente con esta aproximación (Limitaciones) 1.- Tamaño estático 2.- Reglas de acceso a datos Las estructuras de datos disponibles en CCno pueden cambiar de Las estructuras de datos disponibles en no pueden cambiar de Las estructuras de datos disponibles en C no imponen restricciones de Las estructuras de datos disponibles en C no imponen restricciones de tamaño en tiempo de ejecución. tamaño en tiempo de ejecución. acceso aalos datos (acceso aleatorio). acceso los datos (acceso aleatorio). Por ejemplo, una tabla de datos tiene un de elementos fijo Por ejemplo, una tabla de datos tieneelemento unnúmero número de elementos fijoque que Ej: en una tabla o matriz, cualquier de la misma es accesible Ej: en una tabla o matriz, cualquier elemento de la misma es accesible no puede cambiarse una vez declarada. no puede cambiarse unaapropiadamente. vez declarada. sin más que indexarlo sin más que indexarlo apropiadamente. Incluso empleando reserva Incluso empleando reservadinámica, dinámica,una unavez vezreservada reservadalalamemoria, memoria,elel número de es número deelementos elementos esinvariable. invariable. En ocasiones es importante En ocasiones es importanterestringir restringirelelacceso accesoaadatos datosoocontrolar controlarelel orden en acceden. orden enque quese se acceden. Hay aplicaciones que requieren Hay aplicaciones que requierenesta estapropiedad: propiedad: Ej: Ej:Bases Basesde dedatos datos(el (elnúmero númerode deelementos elementosno noes esconocido conocidoen entiempo tiempo de ejecución y no es calculable con antelación. de ejecución y no es calculable con antelación. TEMA TEMA7: 7: Estructuras Estructurasde dedatos datos ESTRUCTURAS DE DATOS = INFORMACIÓN Hasta ahora sabemos almacenar la información en variables individuales o tablas (de tipos de dato estándar o estructuras) + REGLAS DE ACCESO Ciertos problemas no admiten solución sencilla o eficiente con esta aproximación (Limitaciones) 1.- Tamaño estático 2.- Reglas de acceso a datos 3.- Ordenación/ Indexación de datos Las estructuras de datos disponibles en CCno pueden cambiar de Las estructuras de datos disponibles en no pueden cambiar de Las estructuras de datos disponibles en C no imponen restricciones de Las estructuras de datos disponibles en C no imponen restricciones de tamaño en tiempo de ejecución. Las estructuras de datos disponibles en C no permiten establecer de tamaño en tiempo de ejecución. Las estructuras de datos disponibles en C no permiten establecer de acceso aalos datos (acceso aleatorio). acceso los datos (acceso aleatorio). Por ejemplo, una tabla de datos tiene un número de elementos fijo que forma eficiente un orden o criterio de acceso a los datos. Por ejemplo, una tabla de datos tiene un número de elementos fijo que forma eficiente un orden o criterio de acceso los datos. Ej: en una tabla oomatriz, cualquier elemento de laa misma es Ej: en una tabla matriz, cualquier elemento de la misma esaccesible accesible no puede cambiarse una vez declarada. no puede cambiarse una vez declarada. sin más que indexarlo apropiadamente. sin más que indexarlo apropiadamente. Incluso empleando reserva dinámica, vez la memoria, elel Ej: Es costoso computacionalmente crear una tabla de elementos Incluso empleando reserva dinámica,una una vezreservada reservada la memoria, Ej: Es costoso computacionalmente crear una tabla de elementos número de es ordenados alfabéticamente oopor otro criterio, partiendo de número deelementos elementos esinvariable. invariable. ordenados alfabéticamente porcualquier cualquier otro criterio, partiendo de En ocasiones es importante restringir elelacceso aadatos oocontrolar elel Enun ocasiones es importante restringir acceso datos controlar listado desordenado. un en listado desordenado. orden acceden. orden enque quese se acceden. Hay aplicaciones que requieren Hay aplicaciones que requierenesta estapropiedad: propiedad: Ej: Ej:Bases Basesde dedatos datos(el (elnúmero númerode deelementos elementosno noes esconocido conocidoen entiempo tiempo de ejecución y no es calculable con antelación. de ejecución y no es calculable con antelación. TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas COLAS COLAS Lista unidimensional de datos a la que se accede de forma FIFO (First In, First Out: El primero en entrar es el primero en salir) Los elementos se almacenan en fila, pero sólo pueden añadirse por un extremo y leerse por el otro. IN Dato 1 Dato 2 Dato 3 Dato 4 OUT Gestión Gestiónde deColas Colasen enCC • La lista puede materializarse en C, en su forma más simple, como una tabla de datos (estructuras) • Se accede a los elementos sólo mediante dos funciones void calmac(struct dato); Almacena dato en cola struct dato crecup(void); Recupera dato de cola • El acceso a los elementos de la tabla sin emplear estas dos funciones no está permitido. TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas Funciones Funcionesde demanipulación manipulaciónde deCOLAS COLAS Variables globales necesarias para que trabajen las funciones struct dato p[MAX]; /* tabla para la cola */ int spos; /* índice de almacenamiento: primer lugar vacío */ int rpos; /* índice de recuperación: primer elemento a sacar */ void voidcalmac(struct calmac(structdato datoq) q) {{ ifif(spos==MAX) (spos==MAX) {printf("Cola {printf("Colallena\n"); llena\n");return; return; }} p[spos]=q; p[spos]=q; struct spos++; structdato datocrecup(void) crecup(void) spos++; {{ }} ifif(rpos==spos) (rpos==spos) {printf("Cola {printf("Colavacía\n"); vacía\n"); return NULL;} return NULL;} rpos++; rpos++; return returnp[rpos-1]; p[rpos-1]; }} rpos D1 p[0] D2 p[1] D3 p[2] p[3] spos ….. p[MAX] TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas COLA COLACIRCULAR CIRCULAR La cola se llena, aún cuando haya posiciones libres en la tabla: Ej: Si en el ejemplo anterior introducimos y sacamos un elemento 5 veces, la cola se llena Problema con la estructura de cola abierta Cerramos la cola para que el último y primer elemento sean contiguos IDEA !! D2 p[1] D3 p[2] p[3] spos ….. p[MAX-1] ] -1 AX p[0] M p[ D1 p[ 0] rpos 1] p[ ] p[2 Para que la cola funcione de este modo, sólo hay que gestionar los índices spos y rpos apropiadamente TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas Funciones Funcionesde demanipulación manipulaciónde deCOLAS COLASCIRCULARES CIRCULARES Variables globales necesarias para que trabajen las funciones struct dato p[MAX]; /* tabla para la cola */ int spos; /* índice de almacenamiento: primer lugar vacío */ int rpos; /* índice de recuperación: primer elemento a sacar */ void voidccalmac(struct ccalmac(structdato dato q) q) {{ if(spos+1== if(spos+1==rpos rpos||||(spos==MAX-1 (spos==MAX-1&& && rpos ==0)) rpos ==0)) {{ printf("Cola printf("Colallena\n"); llena\n"); return; return; }} p[spos]=q; p[spos]=q; spos++; spos++; if(spos==MAX) if(spos==MAX)spos=0; spos=0; }} struct structdato datoccrecup(void) ccrecup(void) {{ ifif(rpos==spos) (rpos==spos) { {puts("Cola puts("Colavacía\n"); vacía\n"); return NULL; return NULL; }} ifif(rpos==MAX-1) (rpos==MAX-1) { {rpos=0; rpos=0; return returnp[MAX-1]; p[MAX-1]; }} return returnp[rpos++]; p[rpos++]; }} TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas Funciones Funcionesde demanipulación manipulaciónde deCOLAS COLASCIRCULARES CIRCULARES Variables globales necesarias para que trabajen las funciones struct dato p[MAX]; /* tabla para la cola */ int spos; /* índice de almacenamiento: primer lugar vacío */ int rpos; /* índice de recuperación: primer elemento a sacar */ void struct voidccalmac(struct ccalmac(structdato dato q) q) structdato datoccrecup(void) ccrecup(void) {{ {{ spos if(spos+1== ififX(rpos==spos) X if(spos+1==rpos rpos||||(spos==MAX-1 (spos==MAX-1&& && (rpos==spos) X rpos { {puts("Cola X rpos==0)) ==0)) puts("Colavacía\n"); vacía\n"); {{ return NULL; return NULL; X X printf("Cola llena\n"); } rpos printf("Cola llena\n"); } X X return; if (rpos==MAX-1) return; X if (rpos==MAX-1) X }} { {rpos=0; rpos=0; p[spos]=q; return p[spos]=q; returnp[MAX-1]; p[MAX-1]; spos++; } spos++; } if(spos==MAX) spos=0; return if(spos==MAX) spos=0; returnp[rpos++]; p[rpos++]; }} } }llena con los La cola se índices en posiciones intermedias de la tabla TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas Funciones Funcionesde demanipulación manipulaciónde deCOLAS COLASCIRCULARES CIRCULARES Variables globales necesarias para que trabajen las funciones spos rpos struct dato p[MAX]; /* tabla para la cola */ X int spos; /* índice de almacenamiento: primerX lugar vacío */ X int rpos; /* índice de recuperación: primer elemento a sacar */ X void voidccalmac(struct ccalmac(structdato dato q) q) {{ if(spos+1== if(spos+1==rpos rpos||||(spos==MAX-1 (spos==MAX-1&& && rpos ==0)) rpos ==0)) {{ printf("Cola printf("Colallena\n"); llena\n"); return; return; }} p[spos]=q; p[spos]=q; spos++; spos++; if(spos==MAX) if(spos==MAX)spos=0; spos=0; }} X X X X struct ccrecup(void) structdato dato ccrecup(void) X X {{ ifif(rpos==spos) (rpos==spos) { {puts("Cola puts("Colavacía\n"); vacía\n"); return NULL; return NULL; La cola } }se llena con los índices en las posiciones ififextremas (rpos==MAX-1) (rpos==MAX-1) de la tabla { {rpos=0; rpos=0; return returnp[MAX-1]; p[MAX-1]; }} return returnp[rpos++]; p[rpos++]; }} TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas Funciones Funcionesde demanipulación manipulaciónde deCOLAS COLASCIRCULARES CIRCULARES Variables globales necesarias para que trabajen las funciones spos struct dato p[MAX]; /* tabla para la cola */ X rpos int spos; /* índice de almacenamiento: primer lugar vacío */ X int rpos; /* índice de recuperación: primer elemento a sacar */ void voidccalmac(struct ccalmac(structdato dato q) q) {{ if(spos+1== if(spos+1==rpos rpos||||(spos==MAX-1 (spos==MAX-1&& && rpos ==0)) rpos ==0)) {{ printf("Cola printf("Colallena\n"); llena\n"); return; return; }} p[spos]=q; p[spos]=q; spos++; spos++; if(spos==MAX) if(spos==MAX)spos=0; spos=0; }} X X X X struct ccrecup(void) structdato dato ccrecup(void) X X {{ ifif(rpos==spos) (rpos==spos) { {puts("Cola puts("Colavacía\n"); vacía\n"); return NULL; return NULL; Si spos se sale de la tabla, } } cerramos la cola ifif(rpos==MAX-1) devolviéndola al principio. (rpos==MAX-1) { {rpos=0; rpos=0; return returnp[MAX-1]; p[MAX-1]; }} return returnp[rpos++]; p[rpos++]; }} TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas Funciones Funcionesde demanipulación manipulaciónde deCOLAS COLASCIRCULARES CIRCULARES Variables globales necesarias para que trabajen las funciones struct dato p[MAX]; /* tabla para la cola */ int spos; /* índice de almacenamiento: primer lugar vacío */ int rpos;spos /* índice de recuperación: primer elemento a sacar */ rpos void voidccalmac(struct ccalmac(structdato dato q) q) {{ if(spos+1== if(spos+1==rpos rpos||||(spos==MAX-1 (spos==MAX-1&& && rpos ==0)) rpos ==0)) {{ printf("Cola printf("Colallena\n"); llena\n"); return; return; }} Si el índice de salida de datos (rpos) coincide con p[spos]=q; p[spos]=q; el de entrada (spos), la spos++; spos++; cola está vacía if(spos==MAX) if(spos==MAX)spos=0; spos=0; }} struct structdato datoccrecup(void) ccrecup(void) {{ ifif(rpos==spos) (rpos==spos) { {puts("Cola puts("Colavacía\n"); vacía\n"); return NULL; return NULL; }} ifif(rpos==MAX-1) (rpos==MAX-1) { {rpos=0; rpos=0; return returnp[MAX-1]; p[MAX-1]; }} return returnp[rpos++]; p[rpos++]; }} TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas Funciones Funcionesde demanipulación manipulaciónde deCOLAS COLASCIRCULARES CIRCULARES Variables globales necesarias para que trabajen las rpos funciones X struct dato p[MAX]; /* tabla para la cola */ int spos; /* índice de almacenamiento: primer lugar vacío */ int rpos; /* índice de recuperación: primer elemento a sacar */ X X spos void voidccalmac(struct ccalmac(structdato datoX q) q) {{ X if(spos+1== rpos || (spos==MAX-1 if(spos+1== rpos || (spos==MAX-1&& && rpos ==0)) rpos ==0)) {{ printf("Cola printf("Colallena\n"); llena\n"); return; return; }} Si rpos apunta al ultimo elemento de la tabla, el p[spos]=q; p[spos]=q; siguiente en una cola spos++; spos++; circular es rpos=0 if(spos==MAX) if(spos==MAX)spos=0; spos=0; }} struct structdato datoccrecup(void) ccrecup(void) {{ ifif(rpos==spos) (rpos==spos) { {puts("Cola puts("Colavacía\n"); vacía\n"); return NULL; return NULL; }} ifif(rpos==MAX-1) (rpos==MAX-1) { {rpos=0; rpos=0; return returnp[MAX-1]; p[MAX-1]; }} return returnp[rpos++]; p[rpos++]; }} TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas PILAS PILAS Lista unidimensional de datos a la que se accede de forma LIFO (Last In, First Out: El último en entrar es el primero en salir) Los elementos se almacenan en fila, de modo que se añaden por el mismo extremo en que se retiran. Gestión Gestiónde dePilas Pilasen enCC IN OUT • Una PILA puede materializarse en C, en su forma más simple, como una tabla de datos (estructuras) • Se accede a los elementos sólo mediante dos funciones Dato 1 Dato 2 void push (struct dato); Almacena dato en pila struct dato pop (void); Recupera dato de pila Dato 3 Dato 4 • El acceso a los elementos de la tabla sin emplear estas dos funciones no está permitido. TEMA TEMA7: 7: Estructuras Estructurasde dedatos. datos.Colas ColasyyPilas Pilas Funciones Funcionesde demanipulación manipulaciónde dePILAS PILAS Variables globales necesarias para que trabajen las funciones struct dato pila[MAX]; /* tabla para la pila */ int p; /* índice de la siguiente posición libre de la pila*/ void voidpush(struct push(structdato datoq) q) {{ ifif(p>=MAX) (p>=MAX) {printf(“Pila {printf(“Pilallena\n"); llena\n"); return; } return; } pila[p++]=q; pila[p++]=q; }} struct structdato datopop(void) pop(void) {{ ifif(p<=0) (p<=0) {printf(“Pila {printf(“Pilavacía\n"); vacía\n"); return NULL;} return NULL;} return returnpila[--p]; pila[--p]; }} Tipo de dato genérico p D1 p[0] D2 p[1] D3 p[2] p[3] ….. p[MAX] Ejemplo Ejemplode defuncionamiento funcionamientode dePILAS: PILAS:Calculadora Calculadoraen ennotación notaciónPostfija Postfija /* Calculadora en notacion postfija*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 50 void push (float,int*,float*); void pop(float*,int*,float*); void main(void) { float ptabla[MAX]; int pos=0; char s[20]; float a,b,aux; printf("Introduzca operadores u operandos\n"); do{ scanf("%s",s); switch(s[0]){ case '+':pop(&a,&pos,ptabla); pop(&b,&pos,ptabla); printf("%f\n",a+b); push(a+b,&pos,ptabla); break; case '-':pop(&a,&pos,ptabla) pop(&b,&pos,ptabla); printf("%f\n",b-a); push(b-a,&pos,ptabla); break; case '*':pop(&a,&pos,ptabla); pop(&b,&pos,ptabla); printf("%f\n",a*b); push(a*b,&pos,ptabla); break; case '/':pop(&a,&pos,ptabla); pop(&b,&pos,ptabla); if(a==0){ printf("Divison por cero\n"); break; } printf("%f\n",b/a); push(b/a,&pos,ptabla); break; default: aux=atof(s); push(aux,&pos,ptabla); } }while(s[0]!='q'); } Ejemplo Ejemplode defuncionamiento funcionamientode dePILAS: PILAS:Calculadora Calculadoraen ennotación notaciónPostfija Postfija void push(float v,int *ppos,float *t) { if(*ppos>=MAX){ printf("Pila llena\n"); return; } t[*ppos]=v; (*ppos)++; } void pop(float *v,int *ppos,float *t) { if(*ppos==0){ printf("Pila vacia\n"); return; } (*ppos)--; *v=t[*ppos]; }