Escolar Documentos
Profissional Documentos
Cultura Documentos
Filas
Filas
Devido s caractersticas das operaes da fila, o primeiro elemento inserido ser o primeiro a ser retirado
A poltica de insero e remoo de dados maneira de uma fila conhecida como "FIFO" (First In, First Out) Filas so usadas tipicamente quando deseja-se processar itens de acordo com sua ordem de chegada
Filas
A B
A B C B C
fim
incio
C
fim
A
incio
4
fim
insere(F, e): e inserido no final da fila F retira(F, e): retira o elemento mais antigo da fila F (o elemento que est no incio de F) e retorna seu valor atravs de e vazia(F): indica se a fila est vazia ou no comp(F): retorna o nmero de elementos na fila F (comprimento da fila)
Filas - Exemplo
insere(fila,A); insere(fila,B); insere(fila,C); incio ok=retira(fila,e);
fila
incio
A B
fim
C A B C
B C
fim
A
incio fim
Funes Bsicas:
vazia(&fila); inicia(&fila); retira(&fila, &e); insere(&fila, e);
7
Filas
2 PARTE
Filas - Implementaes
2) Problema: impossvel remover elemento de uma fila vazia Soluo: utilizar a funo vazia(F) antes de remover elemento
3) Problema: controlar incio e fim da fila Soluo: incluir dois campos (ini e fim) para armazenar a posio do incio e do fim da fila
10
tp_fila fila;
12
Fila Vazia: Funo insere: (fila.fim<fila.ini) f.item[++f.fim]=e; Fila Lotada: (fila.fim==MAX-1) Funo retira: No de elementos: *e=f.item[f.ini++]; (fila.fim-fila.ini+1)
C
(3)
(1)
B C
(2)
C D E
(4)
fim: 0 MAX: 5
fim: 2 MAX: 5
C
(3)
DE
14
B C
(2)
C D E
(4)
Outra Soluo?
16
Fila Circular
Soluo 2: visualizar o vetor que armazena a fila como um crculo Fila Circular se o ltimo elemento da fila ocupa a ltima posio do vetor, um novo elemento pode ser inserido no incio do vetor
ini: 0 fim: -1 MAX: 5 (1) ABCD ini: 0 A B C fim: 3 17 MAX: 5 (2)
0 1 2 3 4
D E
Fila Circular
Outras consideraes:
Funo para determinar o prximo elemento:
/* outra opo */
(1)
F G C D E
(4)
19
Soluo?
ABCD ini: 0 fim: -1 MAX: 5
0 1 2 3 4
(1)
(3)
EFGHI
C D
(2)
F G H I
(4)
Soluo:
considerar que fila.ini a posio anterior ao primeiro elemento da fila Para verificar se a fila est vazia: (fila.ini==fila.fim) Para inicializar incio e fim com ltima posio: fila.ini = fila.fim = MAX-1; (precede posio 0)
21
(1)
C D
(2)
F G H I
(4)
Soluo:
sacrificar uma posio do vetor, permitindo incluir apenas MAX-1 elementos h sempre uma posio vazia para marcar incio/fim da fila Teste de Fila Cheia:
prox(fila.fim)==fila.ini
23
(1)
(3) EFGH
C D
(2)
F G H E
(4)
24
Fila Circular
Funes Bsicas:
vazia(&fila); inicia(&fila); retira(&fila, &e); insere(&fila, e);
26
Fila Circular
Funo vazia(&fila): int vazia(tp_fila *f) { if (f->ini == f->fim) return 1; else return 0; } Funo inicia(&fila): void inicia (tp_fila *f) { f->ini=f->fim=MAX-1; }
27
Fila Circular
int retira(tp_fila *f, tp_item *e) { if (vazia(f)) return 0; else { f->ini=prox(f->ini); *e=f->item[f->ini]; return 1; } }
28
Fila Circular
int insere(tp_fila *f, tp_item e) { if (prox(f->fim)==f->ini) return 0; else { f->fim=prox(f->fim); f->item[f->fim] = e; return 1; } }
29
Fila Circular
30
Fila Circular
Para percorrer:
/*outra forma */ i=fila.ini; while (i!=fila.fim) { i=prox(i); printf("%d\t",fila.item[i]); } printf("\n");
31