Você está na página 1de 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

APOSTILA ALGORITMOS E ESTRUTURAS DE DADOS COM JAVA

CAPTULO 7

Filas
"O xito no se consegue s com qualidades especiais. sobretudo um trabalho de constncia, de mtodo e de organizao" J. P. Sergent

7.1 - INTRODUO
No dia a dia, estamos acostumados com as filas em diversos lugares: nos bancos, nos mercados, nos hospitais, nos cinemas entre outros. As filas so importantes pois elas determinam a ordem de atendimento das pessoas. As pessoas so atendidas conforme a posio delas na fila. O prximo a ser atendido o primeiro da fila. Quando o primeiro da fila chamado para ser atendido a fila "anda", ou seja, o segundo passa a ser o primeiro, o terceiro passa a ser o segundo e assim por diante at a ltima pessoa. Normalmente, para entrar em uma fila, uma pessoa deve se colocar na ltima posio, ou seja, no fim da fila. Desta forma, quem chega primeiro tem prioridade. Neste captulo, estamos interessados em desenvolver estrutura de dados com o comportamentos das filas. Assim como Listas e Pilhas, as Filas so estruturas de dados que armazenam os elementos de maneira sequencial. Assim como as Pilhas, as Filas tm operaes mais restritas do que as operaes das Listas. Nas Filas, os elementos so adicionados na ltima posio e removidos da primeira posio. Nas Listas, os elementos so adicionados e removidos de qualquer posio. Ento, podemos implementar uma Fila simplesmente colocando as restries adequadas nas operaes de adicionar e remover elementos de uma Lista. Isso bem parecido ao que fizemos com as Pilhas.

w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u

1/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

Vamos implementar na seqncia uma Fila de Aluno. Iremos aproveitar a classe Aluno feita no captulo de armazenamento sequencial.

7.2 - INTERFACE DE USO


As operaes que formam a interface de uso da Fila de alunos so: 1. Insere um Aluno (coloca um aluno no fim da Fila). 2. Remove um Aluno (retira o aluno que est no comeo da Fila). 3. Informa se a Fila est vazia. O esboo da classe F l seria mais ou menos assim: ia
pbi casFl { ulc ls ia pbi vi isr(ln auo { ulc od neeAuo ln) / ipeeto / mlmna } pbi Auormv( { ulc ln eoe) / ipeeto / mlmna } pbi boenvza){ ulc ola ai( / ipeeto / mlmna } }

Agora que j temos a interface de uso da Fila definida vamos escrever algum teste sobre como ela deveria se comportar.

w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u

2/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

pbi casTse{ ulc ls et pbi sai vi mi(tig]ag){ ulc ttc od anSrn[ rs Fl fl =nwFl(; ia ia e ia) Auoauo=nwAuo) ln ln e ln(; fl.neeauo; iaisr(ln) Auoauoeoio=fl.eoe) ln lnRmvd iarmv(; i (iavza) { f fl.ai() Sse.u.rnl(Afl et vza) ytmotpitn" ia s ai"; } } }

Como j foi dito aqui vamos implementar Fila utilizando algum tipo de Lista. Neste captulo, vamos utilizar a classe L n e L s para armazenar os alunos da ikdit Fila.
pbi casFl { ulc ls ia piaeLs<ln>auo =nwLneLs<ln>) rvt itAuo lns e ikditAuo(; }

Voc pode tambm fazer o curso CS-14 dessa apostila na Caelum Querendo aprender ainda mais sobre estrutura de dados? Esclarecer dvidas dos exerccios? Ouvir explicaes detalhadas com um instrutor? A Caelum oferece o curso CS-14 presencial nas cidades de So Paulo, Rio de Janeiro e Braslia, alm de turmas incompany. Consulte as vantagens do curso Algoritmos e Estruturas de Dados com Java.

7.3 - OPERAES EM FILA


Em seguida, implementaremos as operaes da Fila de aluno.

7.4 - INSERIR UMA ALUNO


w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u 3/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

Os alunos que entram na Fila devem sempre se colocar no fim da mesma. Vamos definir que o fim da Fila o fim da Lista que estamos utilizando para implementar. Ento, entrar na Fila e adicionar no fim da Lista.
pbi casFl { ulc ls ia piaeLs<ln>auo =nwLneLs<ln>) rvt itAuo lns e ikditAuo(; pbi vi isr(ln auo { ulc od neeAuo ln) ti.lnsadauo; hsauo.d(ln) } }

7.5 - REMOVER UM ALUNO


O prximo aluno a ser atendido sempre o que est no incio da Fila. No nosso caso, quem est no incio da Fila o aluno que est no incio da Lista. Ento, basta remover o primeiro aluno.
pbi casFl { ulc ls ia piaeLs<ln>auo =nwLneLs<ln>) rvt itAuo lns e ikditAuo(; .. . pbi Auormv( { ulc ln eoe) rtr ti.lnsrmv() eun hsauo.eoe0; } }

bom observar que se o mtodo r m v ( for usado com a Fila vazia ento uma eoe) exceo ser lanada pois o mtodo r m v F r t )lana eoeis( I d x u O B u d E c p i nquando no existir elemento para remover. neOtfonsxeto

Nova editora Casa do Cdigo com livros de uma forma diferente Editoras tradicionais pouco ligam para ebooks e novas tecnologias. No conhecem programao para revisar os livros tecnicamente a fundo. No tm anos de experincia em didticas com cursos. Conhea a Casa do Cdigo, uma editora diferente, com curadoria da Caelum e obsesso por livros de qualidade a preos justos.

w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u

4/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

Casa do Cdigo, ebook com preo de ebook.

7.6 - INFORMAR SE A FILA EST VAZIA


Para implementar esta operao basta verificar se o tamanho da Lista zero.
pbi casFl { ulc ls ia piaeLs<ia auo =nwLneLs<ia(; rvt itFl> lns e ikditFl>) .. . pbi boenvza){ ulc ola ai( rtr ti.lnssz( = 0 eun hsauo.ie) = ; } }

7.7 - GENERALIZAO
Nossa Fila s funciona para guardar objetos da classe A u o Vamos generalizln. la para poder armazenar qualquer tipo de objeto. Isso ser feito utilizando a classe O j c da qual todas as classes derivam direta ou indiretamente. Criaremos uma bet L n e L s de O j c em vez de uma L n e L s de A u o ikdit bet ikdit ln.
pbi casFl { ulc ls ia piaeLs<bet ojts=nwLneLs<bet(; rvt itOjc> beo e ikditOjc>) pbi vi isr(betojt){ ulc od neeOjc beo ti.beo.d(beo; hsojtsadojt) } pbi Ojc rmv( { ulc bet eoe) rtr ti.beo.eoe0; eun hsojtsrmv() } pbi boenvza){ ulc ola ai( rtr ti.beo.ie)= 0 eun hsojtssz( = ; } }

Agora, podemos guardar qualquer tipo de objeto na Fila. Isso uma grande vantagem pois a classe F l poder ser reaproveitada em diversas ocasies. Mas, ia h uma desvantagem, quando removemos um elemento da Fila no podemos garantir qual o tipo de objeto que vir.
w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u 5/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

A soluo para este problema utilizar o recurso do Generics. A nossa classe F l vai ser uma classe parametrizada. Assim, quando criarmos uma Fila ia poderemos definir com qual tipo de objetos ela deve trabalhar. Algo deste tipo:
Fl d auo fl =nwFl d auo(; ia e lns ia e ia e lns)

Traduzindo este cdigo para Java, ficaria assim:


Fl<ln>fl =nwFl<ln>) iaAuo ia e iaAuo(;

Agora, precisamos parametrizar a classe Fila.


pbi casFl<>{ ulc ls iaT piaeLs<>ojts=nwLneLs<>) rvt itT beo e ikditT(; pbi vi isr( t { ulc od neeT ) ti.beo.d() hsojtsadt; } pbi Trmv( { ulc eoe) rtr ti.beo.eoe0; eun hsojtsrmv() } pbi boenvza){ ulc ola ai( rtr ti.beo.ie)= 0 eun hsojtssz( = ; } }

Vamos criar duas Filas, uma para A u oe outra para S r n . ln tig


pbi casTse{ ulc ls et pbi sai vi mi(tig]ag){ ulc ttc od anSrn[ rs Fl<ln>fl =nwFl<ln>) iaAuo ia e iaAuo(; Auoauo=nwAuo) ln ln e ln(; fl.neeauo; iaisr(ln) Auoauoeoio=fl.eoe) ln lnRmvd iarmv(; i (iavza) { f fl.ai() Sse.u.rnl(Afl et vza) ytmotpitn" ia s ai"; } Fl<tig flDSrn =nwFl<tig(; iaSrn> iaetig e iaSrn>) flDSrn.nee"dlie) iaetigisr(Aead"; flDSrn.nee"aoia) iaetigisr(Crln"; Srn crln =flDSrn.eoe) tig aoia iaetigrmv(; Srn aead =flDSrn.eoe) tig dlie iaetigrmv(;
w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u 6/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

Sse.u.rnl(aoia; ytmotpitncrln) Sse.u.rnl(dlie; ytmotpitnaead) } }

Em tempo de compilao, verificado o tipo de objetos que esto sendo adicionados na Fila. Portanto, se voc tentar inserir um objeto do tipo A u oem ln uma Fila de S r n um erro de compilao ser gerado. tig
pbi casTse{ ulc ls et pbi sai vi mi(tig]ag){ ulc ttc od anSrn[ rs Auoauo=nwAuo) ln ln e ln(; Fl<tig flDSrn =nwFl<tig(; iaSrn> iaetig e iaSrn>) / et cdg nocmia / se io opl flDSrn.neeauo; iaetigisr(ln) } }

7.8 - API DO JAVA


Na biblioteca do Java, existe uma interface que define a estrutura de dados Fila. Essa interface chama-se Q e e umas das classes que implementam Q e e a uu, uu L n e L s . O funcionamento fica extremamente parecido com a implementao ikdit que fizemos neste captulo.
pbi casTse{ ulc ls et pbi sai vi mi(tig]ag){ ulc ttc od anSrn[ rs Qeefl =nwLneLs(; uu ia e ikdit) Auoauo=nwAuo) ln ln e ln(; fl.fe(ln) iaofrauo; Auoauoeoio=(ln)iapl(; ln lnRmvd Auofl.ol) i(iaiEpy){ ffl.smt() Sse.u.rnl(Afl et vza) ytmotpitn" ia s ai"; } } }

Para evitar fazer casting de objetos, podemos utilizar o recurso de Generics aqui tambm.
pbi casTse{ ulc ls et pbi sai vi mi(tig]ag){ ulc ttc od anSrn[ rs

w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u

7/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

QeeAuo fl =nwLneLs<ln>) uu<ln> ia e ikditAuo(; Auoauo=nwAuo) ln ln e ln(; fl.fe(ln) iaofrauo; Auoauoeoio=fl.ol) ln lnRmvd iapl(; i(iaiEpy){ ffl.smt() Sse.u.rnl(Afl et vza) ytmotpitn" ia s ai"; } } }

J conhece os cursos online da Caelum? A Caelum oferece dezenas de cursos online em sua plataforma exclusiva de ensino que favorece o aprendizado com a qualidade reconhecida da Caelum. Voc pode escolher um curso nas reas de Java, Ruby, Web, Mobile, .Net e outros, ou fazer a assinatura semestral que d acesso a todos os cursos. Conhea os cursos online da Caelum.

7.9 - EXERCCIOS: FILA


1. Implemente a classe F l para alunos vista neste captulo. Coloque a classe no ia pacote br.com.caelum.ed.filas
pcaeb.o.alme.ia; akg rcmceu.dfls ipr jv.tlLneLs; mot aaui.ikdit ipr jv.tlLs; mot aaui.it ipr b.o.alme.ln; mot rcmceu.dAuo pbi casFl { ulc ls ia piaeLs<ln>auo =nwLneLs<ln>) rvt itAuo lns e ikditAuo(; pbi vi isr(ln auo { ulc od neeAuo ln) ti.lnsadauo; hsauo.d(ln) } pbi Auormv( { ulc ln eoe) rtr ti.lnsrmv() eun hsauo.eoe0; } pbi boenvza){ ulc ola ai(

w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u

8/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

pbi boenvza){ ulc ola ai( rtr ti.lnssz( = 0 eun hsauo.ie) = ; } }

Faa alguns testes.


pcaeb.o.alme.ia; akg rcmceu.dfls ipr b.o.alme.ln; mot rcmceu.dAuo pbi casTse{ ulc ls et pbi sai vi mi(tig]ag){ ulc ttc od anSrn[ rs Fl fl =nwFl(; ia ia e ia) Auoauo=nwAuo) ln ln e ln(; fl.neeauo; iaisr(ln) Auoauoeoio=fl.eoe) ln lnRmvd iarmv(; i (ln ! auoeoio { f auo = lnRmvd) Sse.u.rnl(Er:oauormvd no"+ ytmotpitn"ro ln eoio "iula qefiisrd"; ga o u o neio) } i (fl.ai(){ f !iavza) Sse.u.rnl(Er:Afl noet vza) ytmotpitn"ro ia s ai"; } } }

Se no for impresso nenhuma mensagem de erro significa que a Fila est funcionando. 2. Implemente a classe F l G n r c para objetos (genrica) vista neste captulo. iaeeia Coloque a classe no pacote br.com.caelum.ed.filas
pcaeb.o.alme.ia; akg rcmceu.dfls ipr jv.tlLneLs; mot aaui.ikdit ipr jv.tlLs; mot aaui.it pbi casFlGnrc { ulc ls iaeeia piaeLs<bet ojts=nwLneLs<bet(; rvt itOjc> beo e ikditOjc>) pbi vi isr(betojt){ ulc od neeOjc beo ti.beo.d(beo; hsojtsadojt) } pbi Ojc rmv( { ulc bet eoe) rtr ti.beo.eoe0; eun hsojtsrmv() }
w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u 9/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

pbi boenvza){ ulc ola ai( rtr ti.beo.ie)= 0 eun hsojtssz( = ; } }

Faa alguns testes.


pcaeb.o.alme.ia; akg rcmceu.dfls ipr b.o.alme.ln; mot rcmceu.dAuo pbi casTseiaeeia{ ulc ls etFlGnrc pbi sai vi mi(tig]ag){ ulc ttc od anSrn[ rs FlGnrc flDAuo =nwFlGnrc(; iaeeia iaelns e iaeeia) Auoauo=nwAuo) ln ln e ln(; flDAuo.neeauo; iaelnsisr(ln) Auoauoeoio=flDAuo.eoe) ln lnRmvd iaelnsrmv(; i (ln ! auoeoio { f auo = lnRmvd) Sse.u.rnl(Er:oauormvd noiul"+ ytmotpitn"ro ln eoio ga "a qefiisrd"; o u o neio) } i (flDAuo.ai(){ f !iaelnsvza) Sse.u.rnl(Er:Afl noet vza) ytmotpitn"ro ia s ai"; } } }

Perceba que a classe T s e i a e e i acontm um erro de compilao. Quando etFlGnrc voc remove um elemento da F l G n r c voc recebe uma referncia do tipo iaeeia O j c e no do tipo A u o bet ln. Altere a linha:
Auoauoeoio=flDAuo.eoe) ln lnRmvd iaelnsrmv(;

Por:
Ojc auoeoio=flDAuo.eoe) bet lnRmvd iaelnsrmv(;

Isso faz o cdigo compilar mas agora voc no tem mais a garantia de tipo. No sabe se a referncia que voc recebeu realmente est apontado para um objeto do tipo A u o ln. 3. Implemente a classe F l P r m t i a autilizando o recurso do Generics. iaaaerzd Coloque a classe no pacote br.com.caelum.ed.filas
w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u 10/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

pcaeb.o.alme.ia; akg rcmceu.dfls ipr jv.tlLneLs; mot aaui.ikdit ipr jv.tlLs; mot aaui.it pbi casFlPrmtiaaT { ulc ls iaaaerzd<> piaeLs<>ojts=nwLneLs<>) rvt itT beo e ikditT(; pbi vi isr( t { ulc od neeT ) ti.beo.d() hsojtsadt; } pbi Trmv( { ulc eoe) rtr ti.beo.eoe0; eun hsojtsrmv() } pbi boenvza){ ulc ola ai( rtr ti.beo.ie)= 0 eun hsojtssz( = ; } }

Faa alguns testes:


pcaeb.o.alme.ia; akg rcmceu.dfls ipr b.o.alme.ln; mot rcmceu.dAuo pbi casTseiaeeia{ ulc ls etFlGnrc pbi sai vi mi(tig]ag){ ulc ttc od anSrn[ rs FlPrmtiaaAuo flDAuo = iaaaerzd<ln> iaelns nwFlPrmtiaaAuo(; e iaaaerzd<ln>) Auoauo=nwAuo) ln ln e ln(; flDAuo.neeauo; iaelnsisr(ln) Auoauoeoio=flDAuo.eoe) ln lnRmvd iaelnsrmv(; i (ln ! auoeoio { f auo = lnRmvd) Sse.u.rnl(Er:oauormvd noiul"+ ytmotpitn"ro ln eoio ga "a qefiisrd"; o u o neio) } i (flDAuo.ai(){ f !iaelnsvza) Sse.u.rnl(Er:Afl noet vza) ytmotpitn"ro ia s ai"; } FlPrmtiaaSrn>flDSrn = iaaaerzd<tig iaetig nwFlPrmtiaaSrn>) e iaaaerzd<tig(; flDSrn.nee"in"; iaetigisr(Daa) flDSrn.nee"oqi"; iaetigisr(Jaum) Sse.u.rnl(iaetigrmv() ytmotpitnflDSrn.eoe);
w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u 11/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

Sse.u.rnl(iaetigrmv() ytmotpitnflDSrn.eoe); } }

4. (opcional) possvel implementar a nossa Fila utilizando internamente uma A r y i tem vez de L n e L s ? Teremos algum ganho ou perda no consumo de raLs ikdit tempo de alguma das operaes? Mostre a diferena atravs de um cdigo que adiciona e remova muita gente da fila.

CAPTULO ANTERIOR:

Pilhas
PRXIMO CAPTULO:

Armazenamento sem repetio com busca rpida

Voc encontra a Caelum tambm em:

Blog Caelum

Cursos Online

Facebook

w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u

12/ 13

17/ 10/ 12

Fi s - Al or i m os e Est r ut ur as de D a l g t ados com Java

Newsletter

Casa do Cdigo

Twitter

w w cael m . com . br / apost i - j va- est r ut ur a- dados/ f i s/ #7- 5- r em over - um - al no w. u a l a a l u

13/ 13