Você está na página 1de 7

25/05/12

Estruturas de dados: Filas

Projeto de Algoritmos
Home | Prefcio | Livros | Stios WWW | ndice

Filas
Uma fila uma estrutura de dados que admite insero de novos elementos e remoo de elementos antigos. Mais especificamente, uma fila (= queue) uma estrutura sujeita seguinte regra de operao: sempre que houver uma remoo, o elemento removido o que est na estrutura h mais tempo. Em outras palavras, o primeiro objeto inserido na fila tambm o primeiro a ser removido. Essa poltica conhecida pela sigla FIFO (= First-In-First-Out ). Veja o verbete Queue na Wikipedia.

Implementao em um vetor
Suponha que nossa fila FIFO mora em um vetor f i l a [ 0 . . N 1 ] . Suponha que os elementos do vetor so inteiros (isso s um exemplo; os elementos da fila poderiam ser quaisquer outros objetos). A parte do vetor ocupada pela fila ser
f i l a [ i n i . . f i m 1 ] .

i n i

f i m

N 1

O primeiro elemento da fila est na posio i n ie o ltimo na posio f i m 1 . A fila est vazia se i n i= =f i m e cheia se f i m= =N . Para remover (= delete = de-queue) um elemento da fila basta fazer
x=f i l a [ i n i + + ] ;

Isso equivale ao par de instrues "x=f i l a [ i n i ] ;i n i+ =1 ; ", nesta ordem. claro que voc s deve fazer isso se tiver certeza de que a fila no est vazia. Para inserir (= insert = enqueue) um objeto yna fila basta fazer
f i l a [ f i m + + ]=y ;

Note como a coisa funciona bem mesmo quando a fila est vazia. claro que voc s deve inserir um elemento na fila se ela no estiver cheia; caso contrrio a fila transborda (transbordar = to overflow). Em geral, a tentativa de inserir em uma fila cheia uma situao excepcional, que indica um mau planejamento lgico do seu programa.
www.ime.usp.br/~pf/algoritmos/aulas/fila.html 1/7

25/05/12

Estruturas de dados: Filas

Exerccios
1. Escreva uma funo que devolva o comprimento (ou seja, o nmero de elementos) de uma fila dada.

Aplicao: distncias
Eis uma aplicao clssica do conceito de fila. Imagine 6 cidades numeradas de 0 a 5 e interligadas por estradas de mo nica. ( claro que voc pode trocar "6" pelo seu nmero favorito.) As ligaes entre as cidades so representadas por uma matriz Ada seguinte maneira:
A [ i ] [ j ]vale

1 se existe estrada da cidade ipara a cidade j

e vale 0 em caso contrrio. Suponha que a matriz tem zeros na diagonal, embora isso no seja importante. Exemplo: 0 0 1 0 0 1 0 1 0 0 1 0 0 1 2 0 0 0 1 0 0 3 0 0 0 0 0 0 4 0 0 1 1 0 0 5 0 0 0 0 0 0

0 1 2 3 4 5

A distncia de uma cidade ca uma outra j o menor nmero de estradas que devo percorrer para ir de ca j . Nosso problema: dada uma cidade c , determinar a distncia de ca cada uma das demais cidades. As distncias sero armazenadas em um vetor d : a distncia de ca jser d [ j ] . Que fazer se impossvel chegar de ca j ? Poderamos dizer nesse caso que d [ j ] infinito. Mas mais limpo e prtico dizer que d [ j ]vale 6, pois nenhuma distncia "real" pode ser maior que 5. Se adotarmos cigual a 3 no exemplo acima, teremos digual a 0 1 2 3 4 5 2 2 1 0 1 6

Eis a ideia de um algoritmo que usa o conceito de fila para resolver nosso problema: uma cidade considerada ativa se j foi visitada mas as estradas que comeam nela ainda no foram exploradas; mantenha uma fila das cidades ativas; em cada iterao, remova da fila uma cidade ie insira na fila todas as cidades vizinhas de ique ainda no foram visitadas.
www.ime.usp.br/~pf/algoritmos/aulas/fila.html 2/7

25/05/12

Estruturas de dados: Filas

/ /R e c e b eu m am a t r i zAq u er e p r e s e n t aa si n t e r l i g a e se n t r e / /c i d a d e s0 , 1 , . . , 5 :h u m ae s t r a d a( d em o n i c a )d eiaj / /s ees s eA [ i ] [ j ]= =1 . D e v o l v eu mv e t o rdq u er e g i s t r a / /a sd i s t n c i a sd ac i d a d ecac a d au m ad a so u t r a s :d [ i ]a / /d i s t n c i ad ecai . i n t* d i s t a n c i a s( i n tA [ ] [ 6 ] ,i n tc ) { i n t* d ,j ; i n tf i l a [ 6 ] ,i n i ,f i m ; d=m a l l o c c( 6*s i z e o f( i n t ) ) ; f o r( j=0 ;j<6 ;+ + j ) d [ j ]=6 ; d [ c ]=0 ; i n i=0 ;f i m=1 ;f i l a [ 0 ]=c ; / /ce n t r an af i l a w h i l e( i n i! =f i m ){ i n ti ,d i ; i=f i l a [ i n i + + ] ; / /is a id af i l a d i=d [ i ] ; f o r( j=0 ;j<6 ;+ + j ) i f( A [ i ] [ j ]= =1& &d [ j ]> =6 ){ d [ j ]=d i+1 ; f i l a [ f i m + + ]=j ; / /je n t r an af i l a } } r e t u r nd ; }

(Se fosse escrito sem os "+ + ", o cdigo ficaria ligeiramente menos eficiente.) Para compreender o algoritmo (e provar que ele est correto), observe que as seguintes propriedades invariantes valem no incio de cada iterao: 1. para cada cidade x , se d [ x ]< 6 ento d [ x ] a distncia de ca x ; 2. a sequncia de nmeros 3. se
d [ f i l a [ 0 ] ] ,

,d [ f i l a [ f i m 1 ] ] crescente;

d [ f i l a [ i n i ] ]vale k ento d [ f i l a [ f i m 1 ] ] k + 1 ;

4. para cada ndice hem 0 . . i n i 1 , toda estrada que comea em f i l a [ h ]termina em algum elemento de f i l a [ 0 . . f i m 1 ] .

Exerccios
Responda as seguintes perguntas sobre a funo d i s t a n c i a s . 2. Quem garante que a instruo "f i l a [ f i m + + ] = j " no provoca o transbordamento da fila? Em outras palavras, quem garante que o espao alocado para o vetor f i l a suficiente? 3. Prove que a funo d i s t a n c i a sde fato calcula as distncias corretas. Para isso prove as propriedades invariantes enunciadas acima. 4. Reescreva a funo d i s t a n c i a spara um nmero arbitrrio de cidades. Faa uma verso que devolva a distncia entre duas cidades dadas.
www.ime.usp.br/~pf/algoritmos/aulas/fila.html 3/7

25/05/12

Estruturas de dados: Filas

5. Imagine um labirinto quadrado 10-por-10. As posies livres so marcadas com 0 , as posies bloqueadas com 1 . H uma formiga na posio (1,1) (e essa posio livre). Ajude a formiga a sair do labirinto. A sada est em (10,10) e essa posio livre. (Sugesto: Faa uma "moldura" de 1 s em volta do labirinto. O labirinto fica sendo uma matriz L [ 1 2 ] [ 1 2 ] .)

Implementao circular
No exemplo das distncias, fcil ver que o vetor que abriga a fila no precisa ter mais componentes que o nmero total de cidades, pois cada cidade entra na fila no mximo uma vez. Em geral, entretanto, difcil prever o espao necessrio para abrigar a fila. Nesses casos, mais inteligente implementar a fila de maneira "circular", como mostraremos a seguir. Suponha que os elementos da fila esto dispostos no vetor seguintes maneiras:
f i l a [ i n i . . f i m 1 ] 0 i n i f i l a [ 0 . . N 1 ] de

uma das

ou

f i l a [ i n i . . N 1 ]f i l a [ 0 . . f i m 1 ] . f i m N 1

f i m

i n i

N 1

Teremos sempre 0 i n i< Ne 0 f i m< N , mas no podemos supor que i n i f i m. A fila est vazia se cheia se
f i m= =i n ie f i m + 1= =i n i

ou

f i m + 1= =N e i n i= =0.

(Resumindo, a fila est cheia se ( f i m + 1 )%N= =i n i .) A posio f i mficar sempre desocupada, para que possamos distinguir uma fila cheia de uma vazia. Para remover um elemento da fila basta fazer
x=f i l a [ i n i + + ] ; i f( i n i= =N )i n i=0 ;

claro que isso s deve ser feito se voc sabe que a fila no est vazia. Para inserir um elemento yna fila faa
i f( f i m+1= =i n i| |f i m+1= =N& &i n i= =0 ){ p r i n t f( " \ n S o c o r r o !F i l av a it r a n s b o r d a r ! \ n " ) ; e x i t( E X I T _ F A I L U R E ) ; } f i l a [ f i m + + ]=y ; i f( f i m= =N )f i m=0 ;

O cdigo comea por verificar se a fila est cheia; se estiver, no h nada a fazer seno pedir
www.ime.usp.br/~pf/algoritmos/aulas/fila.html 4/7

25/05/12

Estruturas de dados: Filas

socorro e abortar o programa.

Exerccios
6. Resolva os seguintes problemas a respeito da implementao circular de uma fila. (Lembre-se de que uma fila um pacote com trs objetos: um vetor e dois ndices. No use variveis globais.) (a) Escreva uma funo que remova um elemento da fila. Quais so os parmetros da funo? (b) Escreva uma funo que insira um nmero na fila. (c) Escreva uma funo que devolva o comprimento (ou seja, o nmero de elementos) da fila. 7. Uma fila dupla (= deque) permite sada e entrada em qualquer das duas extremidades da fila. Implemente uma fila dupla e programe todas as funes de manipulao da estrutura.

Implementao de uma fila em uma lista encadeada


Como administrar uma fila armazenada em uma lista encadeada? Digamos que as clulas da lista so do tipo c e l u l a :
t y p e d e fs t r u c tc e l{ i n t c o n t e u d o ; s t r u c tc e l* p r o x ; }c e l u l a ;

preciso tomar algumas decises de projeto sobre como a fila vai morar na lista. Vamos supor que nossa lista encadeada circular : a ltima clula aponta para a primeira. Vamos supor tambm que a lista tem uma clula-cabea; essa clula no ser removida nem mesmo se a fila ficar vazia. O primeiro elemento da fila ficar na segunda clula e o ltimo elemento ficar na clula anterior clula-cabea. Temos um ponteiro f ique guarda o endereo da clula-cabea. A fila est vazia se f i > p r o x == f i . Uma fila vazia pode ser criada e inicializada assim:
c e l u l a* f i ; f i=m a l l o c c( s i z e o f( c e l u l a ) ) ; f i > p r o x=f i ;

Podemos agora definir as funes de manipulao da fila. A remoo fcil:


/ /R e m o v eu me l e m e n t od af i l af i .S u p eq u eaf i l a / /n oe s t v a z i a .D e v o l v eoe l e m e n t or e m o v i d o . i n tr e m o v e( c e l u l a* f i ){ i n tx ; c e l u l a* p ; p=f i > p r o x ; / /pa p o n t ap r i m e i r od af i l a x=p > c o n t e u d o ; f i > p r o x=p > p r o x ; f r e e( p ) ;
www.ime.usp.br/~pf/algoritmos/aulas/fila.html 5/7

25/05/12

Estruturas de dados: Filas

r e t u r nx ; }

A insero exige um truque de gosto duvidoso: armazenar o novo elemento na clula-cabea original:
/ /I n s e r eu mn o v oe l e m e n t oc o mc o n t e u d oyn af i l af i . / /D e v o l v eoe n d e r e od ac a b e ad af i l ar e s u l t a n t e . c e l u l a* i n s e r e( i n ty ,c e l u l a* f i ){ c e l u l a* n o v a ; n o v a=m a l l o c c( s i z e o f( c e l u l a ) ) ; n o v a > p r o x=f i > p r o x ; f i > p r o x=n o v a ; f i > c o n t e u d o=y ; r e t u r nn o v a ; }

Exerccios
8. Implemente uma fila em uma lista encadeada circular sem clula-cabea. Basta manter o endereo f i mda ltima clula; a primeira clula ser apontada por f i m > p r o x . Se a lista encadeada estiver vazia ento f i m== N U L L . 9. Implemente uma fila em uma lista encadeada simples (no circular) com clulacabea. Ser preciso manter o endereo i n ida clula-cabea e um ponteiro f i m para a ltima clula. 10. Implemente uma fila em uma lista encadeada simples sem clula-cabea. Ser preciso manter um ponteiro i n ipara a primeira clula e um ponteiro f i mpara a ltima. 11. Implemente uma fila em uma lista duplamente encadeada sem clula-cabea. Use um ponteiro i n ipara a primeira clula e um ponteiro f i mpara a ltima.

URL of this site: www.ime.usp.br/~pf/algoritmos/ 1998 | Last modified: Wed Mar 21 10:39:44 BRT 2012 Paulo Feofiloff IME-USP

www.ime.usp.br/~pf/algoritmos/aulas/fila.html

6/7

25/05/12

Estruturas de dados: Filas

www.ime.usp.br/~pf/algoritmos/aulas/fila.html

7/7

Você também pode gostar