Você está na página 1de 31

Filas

Filas

Outro caso particular de Lista Linear


Conjunto ordenado de itens onde as incluses s podem ser feitas em uma extremidade (fim da fila) e as remoes s podem ser feitas na outra extremidade (incio da fila) Exemplo real clssico: fila de pessoas esperando atendimento em um banco: as pessoas do incio da fila so atendidas antes e as que chegam depois, entram no fim da fila

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

Aplicao em Computao: Fila de Impresso Exemplo:


incio

A B
A B C B C

fim

incio

C
fim

A
incio
4

fim

Filas Operaes Bsicas

Seja F uma fila, e e um elemento:

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

Fila Funes Bsicas

Funes Bsicas:
vazia(&fila); inicia(&fila); retira(&fila, &e); insere(&fila, e);
7

Filas

2 PARTE

Filas - Implementaes

Diversas formas de implementar, que se distinguem por:


natureza dos elementos maneira como elementos so armazenados operaes disponveis

Duas formas clssicas:


Listas Seqenciais (Vetor) Lista Encadeada

Filas em Listas Seqenciais


1) Problema: vetor tem tamanho fixo e limitado, enquanto que a fila cresce com a necessidade, sem limite Soluo: limitar o tamanho mximo da fila ao tamanho do vetor

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

Filas com Vetor


#define MAX 100

typedef int tp_item;


typedef struct { tp_item item[MAX]; int ini,fim; } tp_fila;
11

tp_fila fila;

Filas com Vetor


Consideraes Iniciais: fila.fim=-1; /* posio do ltimo elemento */ fila.ini=0; /* posio do primeiro elemento */

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)

Filas com Vetor


Problema:
ini e fim avanam medida em que so feitas incluses e remoes pode acontecer de a fila ter espao mas ser considerada lotada (situao 4)!!
ini: 0 fim: -1 MAX: 5 ABC ini: 0 A fim: 2 13 MAX: 5
0 1 2 3 4

AB ini: 2 fim: 2 MAX: 5 DE ini: 2 fim: 4 MAX: 5

C
(3)

(1)

B C
(2)

C D E
(4)

Filas com Vetor


Soluo 1: modificar retira para deslocar a fila no sentido do incio do vetor a cada remoo e eliminar o campo fila.ini incio sempre no 0
e=f.item[0]; for (i=0; i<fila.fim; i++) fila.item[i]=fila.item[i+1];
fim: -1 MAX: 5
ABC fim: 2 MAX: 5 A (1)

Fila vazia: (fila.fim==-1)


AB

fim: 0 MAX: 5
fim: 2 MAX: 5

C
(3)

DE

14

B C
(2)

C D E
(4)

Filas com Vetor


Problemas com a Soluo 1:
1. Cada eliminao envolve deslocar todos os elementos restantes da fila Ineficincia (principalmente para grandes filas) 2. A definio da operao de remoo envolve a manipulao de apenas um elemento e a sua implementao deve refletir este fato, sem envolver operaes adicionais
15

Filas com Vetor

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

AB ini: 2 C fim: 3 MAX: 5 (3) EFG ini: 2 F G C fim: 1 MAX: 5 (4)

D E

Fila Circular
Outras consideraes:
Funo para determinar o prximo elemento:

int prox (int pos) { if (pos==MAX-1) return 0; else return pos+1; }


18

/* outra opo */

int prox (int pos) { return (pos+1)%MAX; }

Fila Circular Fila Vazia

Determinao de Fila Vazia? no pode mais ser feita por (fila.fim<fila.ini)


ini: 0 fim: -1 MAX: 5
0 1 2 3 4

(1)

ini: 2 fim: 1 MAX: 5

F G C D E
(4)

19

Fila Circular Fila Vazia

Soluo?
ABCD ini: 0 fim: -1 MAX: 5
0 1 2 3 4

(1)

ini: 4 fim: 3 MAX: 5 ini: 4 fim: 3 MAX: 5

(3)

ABCD ini: 0 A B fim: 3 20 MAX: 5

EFGHI

C D
(2)

F G H I
(4)

Fila Circular Fila Vazia


Problema com a Fila Circular: determinao
de Fila Vazia no pode mais ser feita com (fila.fim<fila.ini)

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

Fila Circular Fila Vazia

Soluo! (fila.ini==fila.fim) Determinao de Fila Cheia?


ABCD Como distinguir Fila Cheia de 2 3 4 0 1 2 3 4 Fila Vazia? ini: 3 Ambas so: fim: 3 (fila.ini==fila.fim) MAX: 5 (3) EFGHI ini: 3 fim: 3 2 MAX: 5

ini: 4 fim: 4 MAX: 5

(1)

ABCD ini: 4 A B fim: 3 22 MAX: 5

C D
(2)

F G H I
(4)

Fila Circular Fila Cheia


Problema: Determinao de Fila Cheia
Situao idntica da Fila Vazia

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

Fila Circular Fila Cheia


Fila Vazia (fila.ini==fila.fim)
ABCD ini: 4 fim: 4 MAX: 5
0 1 2 3 4 0 1 2 3 4

(1)

ini: 3 fim: 3 MAX: 5 ini: 3 fim: 2 MAX: 5

(3) EFGH

ABCD ini: 4 A B fim: 3 MAX: 5

C D
(2)

F G H E
(4)

24

Fila Cheia (prox(fila.fim)==fila.ini)

Fila Circular Fila Cheia


Outra Soluo:
Adicionar um novo campo (tam) na estrutura para armazenar o nmero de elementos na fila
Fila Vazia: (fila.tam==0) Fila Cheia: (fila.tam==MAX-1) Soluo no adotada pela maioria dos autores e programadores
25

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

/* outra opo */ int vazia(tp_fila *f) { return (f->ini==f->fim); }

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

Como percorrer a Fila?

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

if (!vazia(&fila)) { i=fila.ini; do { i=prox(i); printf("%d\t",fila.item[i]); } while (i!=fila.fim); printf("\n"); }

Você também pode gostar