Professional Documents
Culture Documents
COLAS
Programacin II
1 Grao EI
ndice
1. 2. 3. 4. 5. Descripcin del TAD Cola Especificacin del TAD Cola Simulacin Ejemplos de uso Implementaciones del TAD Cola
1. 2. 3. 4. 5. Implementacin Implementacin Implementacin Implementacin Comparacin de basada en el TAD Lista con vectores lineales con vectores circulares con simple enlace (punteros) las implementaciones
6. Modalidades de colas
1. Bicolas 2. Colas de prioridad
Programacin II
1 Grao EI
Ejemplos en informtica:
Los Sistema Operativos las utilizan en la gestin de recursos que pueden ser compartidos por varios procesos (gestin de memoria, tiempo de procesador, gestin de trabajos de impresin, etc.)
Programacin II 1 Grao EI 3
1. Descripcin del TAD Cola Qu ocurre si alguien intenta colarse o saltarse el turno establecido o si desiste y abandona la cola antes de que le toque el turno?
Consideraremos que la estructura dejar de ser una cola.
Programacin II
1 Grao EI
Programacin II
1 Grao EI
AadirCola : FINAL
E5
E4
E3
E2
E1
FRENTE
EliminarCola:
FINAL
E5
E4
E3
E2
FRENTE
EliminarCola:
FINAL
E5
E4
E3
FRENTE
AadirCola : FINAL
E6
E5
E4
E3
FRENTE
Programacin II
1 Grao EI
esColaVacia(C:TCOLA) devuelve (booleano) efecto: Devuelve TRUE si C es la cola vaca, y FALSE en caso
contrario.
Programacin II
1 Grao EI
aadirCola(C:TCOLA; E:TIPOELEM)
modifica: C efecto: Aade el elemento E por el extremo final de la cola C.
eliminarCola(C:TCOLA)
requerimientos: La cola C es no vaca modifica: C efecto: Suprime el primer elemento de la cola C.
Programacin II
1 Grao EI
2. Especificacin del TAD Cola Mdulo de definicin (.h) del TAD Cola sin incluir tratamiento de errores:
typedef ... TELEMENTO; typedef void * TCOLA; void ColaVacia (TCOLA *q); void AnadirCola (TCOLA *q, TELEMENTO e); int EsColaVacia (TCOLA q); void EliminarCola (TCOLA *q); void PrimeroCola (TCOLA q , TELEMENTO *e);
Programacin II
1 Grao EI
11
Programacin II
1 Grao EI
12
Programacin II
1 Grao EI
13
4. Ejemplos de uso
Creacin de una cola de un nmero determinado de elementos.
void leer(TCOLA * C, short N) { TIPOELEM E; short i; ColaVacia(C); for (i=1;i<=n;i++) { printf(Dime un numero:); sscanf(%d,&E); aadirCola(C,E); } }
Programacin II 1 Grao EI 14
4. Ejemplos de uso
Impresin de los elementos de una cola.
void imprimir (TCOLA *C) { TIPOELEM C; TCOLA aux; ColaVacia(&aux); while ( esColaVacia(*C) == 0 ) { primeroCola(*C,&E); eliminarCola(C); printf(%d\n,E); anadirCola(&aux, E); } while ( esColaVacia(aux) == 0 ) { primeroCola(aux,&E); eliminarCola(&aux); anadirCola(C, E); } }
Programacin II 1 Grao EI
15
Programacin II
1 Grao EI
16
FRENTE 0 E1 1 E2
Programacin II
1 Grao EI
17
typedef int TELEMENTO; typedef struct { TELEMENTO arrayelementos[MAX]; int principio, final; } STCOLA; typedef STCOLA * TCOLA;
Programacin II 1 Grao EI 18
void AnadirCola (TCOLA *q, TELEMENTO e) { int respuesta; respuesta = EsColaLlena (*q); if (respuesta == 1) printf("ERROR, la cola esta llena"); else { (*q)->final++ ; (*q)->arrayelementos [(*q)->final] = e; } } int EsColaVacia (TCOLA q) { int respuesta = (q->final == q->principio); return respuesta; }
Programacin II
1 Grao EI
19
Programacin II
1 Grao EI
20
void PrimeroCola (TCOLA q , TELEMENTO *e) { int respuesta; respuesta = EsColaVacia(q); if (respuesta == 1) printf("ERROR, la cola no tiene elementos"); else *e = q->arrayelementos [q->principio + 1]; }
Programacin II
1 Grao EI
21
C->final: -1
C->principio: -1
C->final: 0
C->principio: -1
E2
C->principio: -1
C->final: 1
E2
E3
C->final: 2
C->final: 2 E3
E2
E2
C->principio: 2
E3
C->final: 2
E2
C->principio: 2
E3
C->final: 2
E2
E3
C->final: 3 E4
Programacin II
1 Grao EI
22
C->final: 4 E3 E4 E5
E2
C->principio: 3
E2
C->principio: 3
E3 E3
C->final: 4 E4 C->final: 5 E4
E5 E5 E6
E2
E2
E3
C->final: 6 E4
E5
E6
E7
E2
E3
C->final: 6 E4
E5
E6
E7
C->final: 6
E1
E2
E3
E4
E5
E6
E7
Programacin II
1 Grao EI
24
Array circular
La posicin siguiente a la ltima del array es la primera
[1]
[2]
[3]
[4]
[5]
[6]
Programacin II
1 Grao EI
25
5.3. Implementacin con arrays circulares Representacin para un mximo MAXSIZE de elementos: array de MAXSIZE elementos:
AadirCola: mueve Final 1 posicin en sentido de agujas del reloj. EliminarCola: mueve Principio 1 posicin en sentido de agujas del reloj.
Final
an
a1
Principio
a2
an-1
1 Grao EI 26
Programacin II
Principio
a2
an-1
1 Grao EI 27
Programacin II
4
q->arraylementos
4
q->arrayelementos
E1
Programacin II
1 Grao EI
28
4
q->arrayelementos
E1
E2
4
q->arrayelementos
E1
E2
E3
PrimeroCola (q): Ser el elemento que ocupa la posicin Siguiente(q.principio), es decir: E1 AadirCola (&q, E4)
q->final q->principio
4
q->arrayelementos
E1
E2
E3
E4
EliminarCola (&q)
q->final q->principio
0
q->arraylementos
E1
E2
E3
E4
Programacin II
1 Grao EI
29
1
q->arrayelementos
E1
E2
E3
E4
PrimeroCola (q): Ser el elemento que ocupa la posicin Siguiente(q.principio), es decir: E3 AadirCola (&q, E5)
q->final q->principio
1
q->arrayelementos
E1
E2
E3
E4
E5
EliminarCola (&q)
q->final q->principio
2
q->arrayelementos
E2
E3
E4
E5
q->principio
2
q->arrayelementos
E6
E2
E3
E4
E5
Programacin II
1 Grao EI
30
2
q->arrayelementos
E6
E7
E3
E4
E5
2
q->arrayelementos
E6
E7
E8
E4
E5
PROBLEMA: La cola est llena pero se cumple la condicin de cola vaca (final==principio).
Programacin II
1 Grao EI
31
Programacin II
1 Grao EI
32
La posicin sacrificada es la ltima que se rellenara (esto es, la referenciada por principio). Recordad que el primer elemento de la cola est en la posicin Siguiente(principio). Al igual que antes Final referencia a la posicin ocupada por el ltimo elemento aadido. Si el array tiene MAX posiciones, no se debe dejar que la cola crezca ms que MAX-1 Cola llena: principio==Siguiente(final) Cola vaca: principio == final
Programacin II
1 Grao EI
33
2
q->arrayelementos
E6
E7
E3
E4
E5
No se podran aadir ms pues se cumple la condicin de cola llena (principio igual a siguiente de final).
Programacin II
1 Grao EI
34
5.3. Implementacin con arrays circulares Simulacin de una cola circular. http://www.cosc.canterbury.ac.nz/people/muk undan/dsal/CQueueAppl.html
Programacin II
1 Grao EI
35
typedef int TELEMENTO; typedef struct { TELEMENTO arrayelementos[MAX]; int principio, final; } STCOLA; typedef STCOLA * TCOLA; int Siguiente ( int pos ) { if (pos < MAX - 1) return (pos+1); else return 0; }
Programacin II
1 Grao EI
36
Programacin II
1 Grao EI
37
COLA
Elemento de la cola Puntero al siguiente nodo Principio E1 E2 Final ... E8
Programacin II
1 Grao EI
40
5.4. Implementacin con punteros Simulacin de una cola implementada con una secuencia enlazada.
http://www.cosc.canterbury.ac.nz/people/mukundan/dsal/LinkQueu eAppl.html
Programacin II
1 Grao EI
41
TNodo;
typedef struct {TNodo * principio, * final; } STCOLA; typedef STCOLA * TCOLA; Estructura cola: Puntero frente y a final, pues es donde se realizan las operaciones de insercin/eliminacin.
q Principio final
E1 dato
E2 dato
. . .
E8 dato
Programacin II
1 Grao EI
42
Programacin II
1 Grao EI
43
Programacin II
1 Grao EI
45
Programacin II
1 Grao EI
46
Programacin II
1 Grao EI
47
Programacin II
1 Grao EI
48
6.1. Dicolas
Conjunto ordinal de elementos
Son colas bidireccionales Eliminaciones/inserciones por ambos extremos Operaciones:
Operaciones de una cola Operaciones nuevas para acceder a ambos extremos:
void ultimo(TCOLA C, TIPOELEM * E); void insertar_frente(TCOLA * C, TIPOELEM E); void suprimir_final(TCOLA *C);
AGUA
RO
AGUA AGUA
RO RO
Programacin II
1 Grao EI
49
6.1. Dicolas Se pueden imponer restricciones respecto al tipo de entrada o al tipo de salida:
Dicola con restriccin de entrada:
Slo se permiten inserciones por uno de los extremos Se permiten eliminaciones por los dos extremos
Programacin II
1 Grao EI
50
Programacin II
1 Grao EI
51
6.2. Colas de Prioridad Cola a cuyos elementos se les ha asignado una prioridad:
El elemento con mayor prioridad es procesado primero Dos elementos con la misma prioridad son procesados segn el orden en que fueron introducidos en la cola.
Ejemplos:
Sistema de tiempo compartido necesario para mantener un conjunto de procesos que esperan servicio para trabajar: TIEMPO CPU, IMPRESORA, ETC.
Programacin II
1 Grao EI
52
Programacin II
1 Grao EI
54
Programacin II
1 Grao EI
55
Programacin II
1 Grao EI
56
Acciones ms importantes:
1. Buscar el ndice en la tabla correspondiente a prioridad m. 2. Si existe y es K, poner el elemento P como final de la cola de ndice K. 3. Si no existe, crear nueva cola y poner el elemento P. 4. Salir
1. Buscar el ndice de la cola de mayor prioridad no vaca. Cola k. 2. Retirar y procesar el elemento frente de la cola k. 3. Salir.
Programacin II
1 Grao EI
57
Programacin II
1 Grao EI
58