Você está na página 1de 6

03/06/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 l [ . N 1 . Suponha que os elementos do ia0.-] vetor so inteiros (isso s um exemplo; os elementos da fila poderiam ser quaisquer outros objetos). A parte do vetor ocupada pela fila ser
fl[n.fm1. iaii.i-]

ii n

fm i

N1 -

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

Isso equivale ao par de instrues "x=f l [ n ] i i+ 1 ", nesta ordem. claro que iaii; n = ; 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
fl[i+]=y iafm+ ;

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

03/06/12

Estruturas de dados: Filas

Exerc cios
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 [ ]vale []j

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

03/06/12

Estruturas de dados: Filas

/ Rcb uamti Aqerpeet a itriasete / eee m arz u ersna s nelge nr / cdds01.,:h uaetaa(emo nc)d iaj / iae ,,.5 m srd d ia e / s es s Ai[]= 1 Dvleu vtrdqergsr / e e []j = . eov m eo u eita / a dsca d cdd cacd uadsota:di a / s itnis a iae aa m a urs [] / dscad cai / itni e . it*itnis(n A]6,itc n dsaca it [[] n ) { it*,j n d ; itfl[] ii fm n ia6, n, i; d=mloc( *szo (n); alc 6 ief it) fr( =0 j<6 +j dj =6 o j ; ; +) [] ; dc =0 [] ; ii=0 fm=1 fl[]=c / cetan fl n ; i ; ia0 ; / nr a ia wie(n ! fm { hl ii = i) iti d; n , i i=fl[n+] / isid fl iaii+; / a a ia d =di; i [] fr( =0 j<6 +j o j ; ; +) i ([]j = 1& dj > 6 { f Ai[] = & [] = ) dj =d +1 [] i ; fl[i+]=j / jetan fl iafm+ ; / nr a ia } } rtr d eun ; }

(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
dfl[], [ia0]

, d f l [ i - ] crescente; [iafm1]

d f l [ n ] vale k ento d f l [ i - ] k 1 [iaii] [iafm1] +;

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

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

03/06/12

Estruturas de dados: Filas

5. Imagine um labirinto quadrado 10-por-10. As posies livres so marcadas com 0 , as posies bloqueadas com - . H uma formiga na posio (1,1) (e essa posio 1 livre). Ajude a formiga a sair do labirinto. A sada est em (10,10) e essa posio livre. (Sugesto: Faa uma "moldura" de - s em volta do labirinto. O labirinto fica 1 sendo uma matriz L 1 ] 1 ] [ 2 [ 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:
fl[n.fm1 iaii.i-] 0 ii n f l [ . N 1 de ia0.-]

uma das

ou

fl[n.N1 fl[.fm1. iaii.-] ia0.i-] fm i N1 -

fm i

ii n

N1 -

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

ou

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

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

claro que isso s deve ser feito se voc sabe que a fila no est vazia. Para inserir um elemento yna fila faa
i (i +1= ii| fm+1= N& ii= 0 { f fm = n | i = & n = ) pit (\Scro Fl vitasodr\"; rnf "noor! ia a rnbra!n) ei (XTFIUE; xt EI_ALR) } fl[i+]=y iafm+ ; i (i = N fm=0 f fm = ) i ;

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

03/06/12

Estruturas de dados: Filas

socorro e abortar o programa.

Exerc cios
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 l l : eua
tpdfsrc cl{ yee tut e it n cned; otuo src cl*rx tut e po; }cll; eua

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 c lula-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 que guarda o endereo da clula-cabea. A fila est vazia se f - p o i i>rx == f . Uma fila vazia pode ser criada e inicializada assim: i
cll *i eua f; f =mloc(ief(eua) i alc szo cll); f-po =f; i>rx i

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


/ Rmv u eeet d fl f.Speqeafl / eoe m lmno a ia i u u ia / noet vza Dvleoeeet rmvd. / s ai. eov lmno eoio itrm e(eua*i { n eo cll f) itx n ; cll *; eua p p=f-po; / paot pier d fl i>rx / pna rmio a ia x=p>otuo -cned; f-po =p>rx i>rx -po; fe () re p;
www.ime.usp.br/ pf/algoritmos/aulas/fila.html 5/7

03/06/12

Estruturas de dados: Filas

rtr x eun ; }

A insero exige um truque de gosto duvidoso: armazenar o novo elemento na clula-cabea original:
/ Isr u nv eeet cmcned yn fl f. / nee m oo lmno o otuo a ia i / Dvleoedr d cb d fl rslat. / eov neeo a aea a ia eutne cll *nee(n y cll *i { eua isr it , eua f) cll *oa eua nv; nv =mloc(ief(eua) oa alc szo cll); nv-po =f-po; oa>rx i>rx f-po =nv; i>rx oa f-cned =y i>otuo ; rtr nv; eun oa }

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

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

Você também pode gostar