Colas y Pilas - Universidad de Sevilla

Anuncio
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];
}
Descargar