Sei sulla pagina 1di 36

Estrutura de Dados em Java

Ccero Aristofnio Garcia de Arajo


March 28, 2016
Verso: 0.05

ndice
1 Introduo

2 Conceitos Fundamentais
2.1 Dados e Informaes . .
2.2 Processamento de Dados
2.3 Pseudocdigos . . . . . .
2.4 Matrizes e Vetores . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

6
6
7
7
8

3 Filas
3.1 Caracterizao . . . . .
3.2 Implementao de Filas
3.3 Fila Circular . . . . . .
3.4 Fila Encadeada . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

10
12
14
21
28

.
.
.
.

List of Algortmos
1
2
3
4
5
6
7

CalcAreaRet: clcular rea de um retngulo . . . . . . . . . . . . .


CalcAreaTri: calcular rea de um tringulo . . . . . . . . . . . . .
PercorrerElemMatriz: percorrer elementos da matriz . . . . . . . .
Organize: organizar a fila . . . . . . . . . . . . . . . . . . . . . . .
IncIndex: incrementar a posio i referente ao incio ou final da fila
Enqueue: incluir um novo objeto na fila encadeada . . . . . . . . .
Dequeue: remover objeto da fila encadeada . . . . . . . . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

8
8
9
22
24
32
32

Apresentao
Este trabalho um material de opoio criado para o ensino da disciplina de Estrutura de Dados em Java do curso de Anlise de Desenvolvimento de Sistemas do IFPB, Campus Cajazeiras,
Paraba.
Sabe-se que existem diversos outros materiais acerca dos assuntos aqui tratados e, inclusive,
que alguns possuem um maior aprofundamento sobre determinados assuntos. Portanto, o principal
objetivo deste material que este seja utilizado pelos estudantes como fonte de consulta e guia
para estudos complementares da disciplina a que se destina, podendo servir ainda como base para
estudos de teorias mais avanados acerca dos temas aqui tratados.

Estruturao
Neste material existem trs tipos de contedos:
Teorias e Exemplos - so texto que apresentam os principais conceitos, caractersticas e discusses sobre o tema abordado;
Execcios de Fixao - so questes tericas e prticas utilizadas para o avaliar o progresso
dos estudantes;
Desafios - so questes que abordam conceitos multidisciplinares ou que fazem correlao
com algum problema real.
As teorias, exemplos e exerccios so abordados com objetivo de fornecer um contedo didtico,
contextualizando cada assunto com aplicaes reais e resgatando conceitos anteriormente abordados em outras disciplinas, sendo este o foco dos desafios.
Este trabalho composto por 7 captulos nos quais os dois primeiros so utilizados para definir
os conceitos bsicos e os demais tratam das tecnologias e das suas aplicaes.
Nos exemplos, as implementaes so realizadas utilizando-se duas linguagens de programao: Java e Scala. Apesar disto, em outros momentos outras linguagens tambm so utilizadas
2

para se demonstrar a interoperabilidade entre estas e outras e para demonstrar como determinadas
linguagens so utilizadas para se abordar um mesmo assunto. O maior objetivo com isto deixar o
estudante ciente de que a linguagem apenas um meio para se chegar a um determinado fim, sendo
a teoria o principal componente a ser entendido.

Caixas de Dilogos
Para chamar a ateno do estudante para determinados aspectos importantes em uma teoria ou
para destacar uma determinada forma de utilizao dos assuntos foram criadas algumas caixas de
dilogos.

TTULO DA DICA
Descrio das dicas relacionadas a uma forma de implementar, a um site que possui informao
adicional ou a uma forma interessante de entender melhor o assunto.

PERGUNTA CHAVE
A pergunta chave pode ser descrita em apenas uma frase ou pode ser contextualizada para
fornecer um melhor entendimento sobre.

TTULO DA NOTCIA
Descrio de uma notcia que trate do tema abordado.

TTULO DA INFORMAO
Esta informao funciona como uma dica de estudo que no deve ser esquecido, seja pela sua
importncia dentro de uma abordagem ou por sua relevncia com o tema abordado.

Captulo 1

Introduo
Em diversos contextos, disciplinas associadas programao recebem a denominao de processamento de dados. Esta denominao no gratuita de fato, embora seja possvel criar procedimentos que no manipulem nenhum dado, tais procedimentos seriam de pouco valor prtico.
Uma vez que procedimentos so, efetivamente, processadores de dados, a eficincia de um
procedimento est muito associada forma como seus dados so organizados. Estrutura de dados
o ramo da computao que estuda os diversos mecanismos de organizao de dados para atender
aos diferentes requisitos de processamento.
As estruturas de dados definem a organizao, mtodos de acesso e opes de processamento
para a informao manipulada pelo programa. A definio da organizao interna de uma estrutura
de dados tarefa do projetista da estrutura, que define tambm qual a API para a estrutura, ou seja,
qual o conjunto de procedimentos que podem ser usados para manipular os dados na estrutura.
esta API que determina a viso funcional da estrutura de dados, que a nica informao relevante
para um programador que v utilizar uma estrutura de dados pr-definida.
Dentre outras, duas estruturas de dados podem ser destacadas aqui como forma de fornecer um
melhor entendimento sobre os conceitos que viro. So elas:
filas: um conjunto de elementos armazenados de forma sequencial que estabelece um poltica
de manipulao chamada de FIFO (First In, First Out o primeiro a entrar o primeiro a
sair), ou seja, a excluso sempre feita no primeiro elemento e a insero sempre feita na
posio subsequente ao ltimo elemento do conjunto;
pilha: um conjunto de elementos armazenados na forma de sobreposio, que estabelece
uma poltica de manipulao LIFO (Last In, First Out o ltimo a entrar o primeiro a sair),
ou seja, a excluso sempre feita no primeiro elemento e a insero sempre torna o novo
elemento o primeiro elemento do conjunto.
No mundo real podemos associar facilmente os termos fila e pilha, onde a primeira pode
ser vista nos atendimentos de bancos e a segunda na forma como os pratos so guardados nas
prateleiras, por exemplo.
4

Para ambos os casos sempre existiro vantagens e desvantagens na forma de armazenamento e


manipulao. Imagine agora se fosse modificado suas polticas para LIFO e FIFO, respectivamente,
para os atendimentos bancrios e prateleiras. O que ocorreria?
Se o atendimento bancrio fosse do tipo LIFO, a ltima pessoa que chegasse seria atendida logo
rapidamente e a primeira pessoa que chegou, provavelmente ficaria sendo a ltima a ser atendida.
No caso da prateleira, seria necessrio colocar sempre um prato embaixo de todos os demais,
considerando que o primeiro o que fica mais acima do monte de pratos. Isto pode se tornar um
problema cada vez maior quando forem inseridos vrios pratos, pois o peso ficar cada vez maior
e a estabilidade do amontoado cada vez mais comprometida.
De forma anloga, pode-se afirmar que existem estruturas de dados que se utilizadas indevidamente, podem piorar a eficincia de um programa, bem como, se adotadas corretamente, faro
com que programas possam ter maior eficincia computacional. Este um dos motivos que fazem
com que o estudo de estrutura de dados seja um dos mais importante para o desenvolvimento de
um programa computacional.
O estudo de Estrutura de Dados no pode ser desvencilhado dos seus aspectos algortmicos,
uma vez que a escolha correta da estrutura adequada para cada caso (problema) depende do conhecimento de algortmos para manipular a estrutura de maneiras diferente e da comparar qual foi
a mais eficiente.
Portanto, entender os princpios de complexidade computacional um requisito bsico para se
avaliar corretamente a adequada adoo de uma estrutura de dados.
Assim sendo, nos prximos captulos sero estudados:
Filas, Pilhas, Listas e Vetores;
Arvores Binrias;
Tcnicas de Contagem;
Complexidade de Algortmos e
Ordenao e Pesquisa de Dados.

Captulo 2

Conceitos Fundamentais

2.1

Dados e Informaes

Antes de se iniciar o estudo de Estrutura de Dados faz-se necessrio entender (ou relembrar)
alguns conceitos fundamentais, tais como: dados, tipos de dados e informao.
Os dados so caracteristicas nicas de algo ou alguem representadas na forma qualitativa, quantitativa, categorica ou at indefinida. Um nico dado, isoladamente, pode ter diversos significados
dependendo do contexto no qual est inserido, isto porque um dado precisa ser atrelado a algo ou
algum para ter algum significado. Por causa disto diz-se que, no mundo computacional, um dado
a menor unidade que pode ser processada ou resultante de um processamento.
Um conjunto de dados tratados a partir de um processamento chamado de informao. Estas
informaes criam um significado que auxilia na tomada de decises. Em outras palavras: sons,
imagens, textos ou animaes so informaes que representam uma abstrao informal de algo
ou algum. Quando estas informaes so processadas produzem conhecimento. O processamento
de informaes no tem como ser feito nos computadores atuais e por isto diz-se que apenas os
humanos possuem a possibilidade de gerar conhecimento. Para resumir na figura 2.1 faz um comparativo entre estes conceitos.

Figure 2.1: Comparao entre dados, informao e conhecimento.

No possvel processar informaes diretamente em um computador, sendo ento necessrio


reduzi-la a um conjunto de dados. Por exemplo, se desejar quantificar a velocidade de um computador, onde, informalmente, voc pode dizer que ele rpido ou lento, no mundo computacional,
necessrio criar uma escala quantitativa como 0, 1 e 2, onde 0 representa um computador muito
lento, 1 representa um computador rpido e 2 representa um computador muito rpido.
Por causa disto necessrio que uma informao seja traduzida em alguns tipos de dados. Os
principais tipos de dados utilizados para isto so: nmericos, alfanumericos e lgicos. Estes tipos
de dados so chamados de tipos primitivos.
Os tipos de dados podem ser valorados como constantes ou variveis. Quando assumem um
tipo de valor constante, os dados permanecem inalterados no processamento, diferente de quando
assumem um tipo de valor varivel, onde o valor pode mudar durante o processamento.

2.2

Processamento de Dados

O processamento de dados uma atividade que executa diversos passos ordenados com objetivo
de produzir novos dados para gerar informaes para um determinado fim.
A obteno inicial de dados e o seu processamento pode ou no ser realizado por meios computacionais e tecnolgicos. Exemplo: um album de fotos pode ser considerado o resultado de um
processamento de dados referente a datas, nome de pessoas ou locais. Neste caso as fotos podem ser organizadas de acordo com as datas do acontecimentos e assim produzir um significado
cronolgico para o organizador.
Observe que, no exemplo acima, os dados de entrada no foram as fotos em si, mas as caractersticas intrnsecas nas fotos como nome das pessoas, nome dos locais onde estas pessoas foram
fotografadas e as datas em que as fotos foram tiradas. A sada foi uma lista de dados organizados
que, ao ligados novamente as fotos, produziram significados para quem desejava o processamento.
Para que possa-se entender que passos devem ser executados durante o processamento, em que
sequncia e quando finaliz-los, necessrio adotar uma estruturao de instrues chamadas de
algortmos.
Alguns autores apresentam o algortmo como uma receita que deve ser seguida. Didaticamente
um timo exemplo de como um algortmo funciona. No entanto para esta disciplina ser adotado
uma linguagem mais prxima das linguagens de programao chamada de pseudocdigo.

2.3

Pseudocdigos

O Portugol um pseudocdigo adotado na disciplina de algortmos para facilitar o aprendizado


de uma linguagem de programao a partir de instrues similares as adotadas nesta linguagem de
7

programao. Para o caso da disciplina de Estrutura de Dados ser adotado um pseudocdigo similar, mas mais preocupado em fornecer um entendimento maior sobre os passos que sero executados do que com a similaridade que esses passos possuem com alguma linguagem de programao.
Isto significa que haver casos em que o pseudocdigo poder ser alterado com o objetivo de
buscar uma melhor forma de entendimento sobre as instrues apresentadas.
Nos algortmos apresentados abaixo pode-se ter um exemplo de como sero apresentadas as
instrues de rotinas para o estudo de estrutura de dados. No algortmo 1 so apresentados os
passos para que possa-se calcular a rea de um retngulo quando adicionado os dados referente
as dimenses dos seus lados. Observe que neste algortmo simples o cdigo foi modularizado, ou
seja, foi includo dentro de um bloco de uma funo.
Algortmo 1 CalcAreaRet: clcular rea de um retngulo
Entrada: (a, b) dimenses dos lados de um retngulo
Sada: area - rea do retngulo
inicio
1: area (a b)
fim
No algortmo 2, reusa-se o algortmo 1 para produzir o resultado esperado. Este recurso, o
reuso, ser adotado sempre que uma funo ou procedimento j tiver sido discutido anteriormente.
Algortmo 2 CalcAreaTri: calcular rea de um tringulo
Entrada: (a, b) dimenses da altura e largura da base do tringulo
Sada: area - rea do tringulo
inicio
1: area CalcAreaRet(a, b)/2
fim

2.4

. reuso do algortmo 1

Matrizes e Vetores

Matrizes so arranjos ordenados de dados que podem ser apresentados em n dimenses. Uma
matriz que possui apenas uma dimenso, ou seja, que unidimensional chamada de Vetor.
Os tipos de dados alocados em uma matrix so, geralmente, homogneos e so agrupados
continuamente na memria cujo acesso feito atravs de ndices (ponteiros). O tamanho de uma
matriz definida na sua inicializao e este tamanho no modificado enquanto estiver alocado em
memria.
Um Vetor, por ser unidimensional, possui ndices que variam de 0 at T 1, onde T o tamanho
deste vetor. Nos casos de matrizes n-dimensionais, de forma idntica, cada dimenso ter ndices
8

que variam de 0 at o tamanho definido para a dimenso. Por exemplo, na matriz bidimensional
apresentada abaixo, cujas dimenses so, convencionalmente, chamadas de linhas e colunas, tmse que o ndice que representa as linhas variam de 0 a 3, pois a quantidade de linhas igual a 4
(T-linhas = 4), e o ndice que representa as colunas variam de 0 a 2 (T-coluna = 3).

M atriz43

1
4
7
0

2
5
8
0

3
6
9
0

, onde os tamanhos so de 4 linhas e 3 colunas

Para se ter acesso a um dos valores da matriz necessrio definir os ndices para o qual deseja
o valor. Ou seja, vetor = M atriz43 [i][j], onde i representa o ndice das linhas e j o ndice das
colunas.
O algortmo bsico usado para percorrer todos os dados de uma matriz pode ser visto no algoritmo 3. Nele, todas as posies de i e j so assumidas partindo sempre de 0 e indo at o tamanho
da dimenso menos 1 (M linhas e N colunas).
Algortmo 3 PercorrerElemMatriz: percorrer elementos da matriz
Entrada: matriz do tamanho M x N
Sada: impressao de todos os valores da matriz
inicio
1: para i = 0 a (M-1) faa
2:
para j = 0 a (N-1) faa
3:
valor A[i][j]
4:
imprima valor
5:
fim para
6: fim para
fim

Captulo 3

Filas
Uma fila uma estrutura de dados linear que possui alocao sequencial de elementos e cuja
manipulao feita em duas extremidades, sendo uma utilizada para insero de elementos e a
outra para excluso.

Figure 3.1: Exemplo de uma fila com alocao sequencial


As filas podem ter uma capacidade finita ou infinita (para no dizer desconhecida). A ideia de
haver uma capacidade infinita definida para uma fila puramente conceitual e pouco praticvel,
uma vez que a simples tentativa de alocar uma infinidade de elementos na memria de um computador esbarrar na limitao de recursos disponveis neste computador. Assim sendo, o melhor
pensar que esta capacidade desconhecida e ai realizar uma tarefa chamada de alocao encadeada de elementos, tambm conhecida como alocao dinmica de memria. Este assunto
ser abordado em uma seo exclusiva deste captulo. Por agora, ser estudado apenas as filas com
capacidade finita.
Para criar uma fila de capacidade finita aloca-se espao em memria de forma proporcional ao
espao ocupado pelo tipo de dado armazenado, ou seja, se a fila do tipo integer, em C e Java,
so alocados para cada elemento 4 bytes (32 bits). Logo, se a capacidade da fila for igual a 10.000
elementos, sero necessrios 40.000 bytes de memria alocada. Esta alocao feita na criao da
fila, por isto diz-se que este tipo de alocao esttica.
Em C, para saber onde um determinado elemento encontra-se na memria necessrio mover os
ponteiros (vide aula de programao), byte a byte, a partir de um ponto de referncia, at encontrar
10

o elemento desejado. Neste caso o ponto de referncia sempre o primeiro byte do primeiro
elemento.

Figure 3.2: Exemplo de cdigo para alocar memria e percorrer elementos em C.


Assim sendo, se desejar conhecer a posio de um elemento X basta percorrer o conjunto de
elementos a partir de um elemento referencial, avanando de um em um elemento at encontrar o
desejado. Matematicamente, pode-se afirmar que a posio do elemento X igual a (i + c), onde
i a posio inicial do elemento referencial e c a distncia entre os elementos.

Figure 3.3: Exemplo de uma fila com alocao sequencial


Por exemplo, na figura 3.3 o elemento referencial possui a posio i = 2 e a distncia para o
elemento desejado c = (n 2), logo a posio do elemento desejado igual a:

11

idesejado = (iref erencial + c)


= 2 + (n 2)

(3.1)

=n
Em Java, todas estas questes relacionadas a percorrer a memria para encontrar um elemento
abstrada, deixando de haver uma preocupao com o tomanho do tipo de dados e para onde o
ponteiro est apontando. Isto ajuda a focar apenas naquilo que realmente interessa: conhecer o
funcionamento das estruturas de dados.

3.1

Caracterizao
As filas podem ser utilizadas em diversos programas para:
controle de documentos para impresso;
recebimento de requisies em um servidor;
troca de mensagens em chats e etc.

A implementao de filas pode ser realizada


atravs de vetor, alocando espao de memria para
os elementos de forma sequencial e contngua1 ou
atravs de encadeamento (a ser tratado em outro
captulo).
Todas as operaes em uma fila podem ser
imaginadas como as que ocorre numa fila de pessoas num banco, exceto pelo fato de que os elementos no se movem na memria quando um elemento retirado. Dessa forma uma soluo seria
reorganizar os elementos dentro da fila sempre que
um elemento for retirado. Considerando o exemplo contido na figura 3.4, se houver a reorganizao
Figure 3.4: Exemplo de operaes em uma fila dos elementos tem-se a eliminao dos buracos
no incio da fila.
Apesar desta reorganizao ser uma soluo
possvel, h um custo associado a ela que pode in1

Contnguo significa estado ou condio do que est proximo, vizinho.

12

viabilizar a sua adoo em solues computacionais onde o tamanho da fila muito grande ou
quando o nmero de operaes de remoo dentro de um nico procedimento muito grande. Ento, como solucionar este problema? Este assunto ser discutido em uma seo mais a frente. Por
agora, a soluo de reorganizao ser adotada para fornecer um melhor entendimento sobre as
operaes realizadas em filas, a saber:

criao da fila informando a sua capacidade (create);


enfileirar um elemento (enqueue);
desenfileirar o primeiro elemento (dequeue);
mostrar os elementos da fila (printAll);
verificar se a fila est vazia (isEmpty);
verificar se a fila est cheia (isFull) e
mostrar a quantidade de elementos contidos efetivamente na fila (count)

IMPLEMENTAO EM JAVA
Como ocorre em outras linguagens, em Java exite um tipo de contrato de codificao onde
possvel definir quais so as operaes de uma estrutura de dados sem a necessidade de
codific-la logo no incio. Este contrato chamado de Interface. Isto facilita o entendimento
sobre como dever ser desenvolvido um determinado cdigo Java e possibilita o reuso de um
contrato para construo de algortmos diferentes, ou seja, a partir de uma interface possvel
criar diversas classes Java, cada uma delas com as mesmas assinaturas de mtodos (operaes),
mas com algortmos diferentes. Exemplo:
//interface Java
public interface MyInterface{
void operation();
}
//primeira implementao da interface Java
public class MyInterfaceImplement1 implements MyInterface{
public void operation(){
System.out.println("Minha classe 1");
}
}
//segunda implementao da interface Java
public class MyInterfaceImplement2 implements MyInterface{
public void operation(){
System.out.println("Minha classe 2");
}
}

13

3.2

Implementao de Filas

Primeiramente necessrio definir a interface que representar a estrutura de dados do tipo fila.
Esta interface ser baseada nas operaes citadas anteriormente, logo:
/
Contrato de uma fila

/
public interface IQueue{
//operao de criar uma fila
void create(int capacity);
//operao de organizao da fila
//depois de uma excluso
void organize();
//inclui um elemento na fila
void enqueue(int element);
//excluir um elemento da fila
void dequeue();
//imprimir a fila atual
void printAll();
//verifica se a fila est vazia
boolean isEmpty();
//verifica se a fila est cheia
boolean isFull();
//verifica quantos elementos
//esto efetivamente na fila
int count();
}

A criao de uma fila requer que seja passado a informao do tamanho da fila para que seja
possvel realizar a alocao esttica de elementos em um vetor.
Em Java a criao de um vetor simples. Primeiro define-se qual o tipo de dado que ser
estruturado (neste primeiro caso, sero nmeros inteiros), depois faz-se uso do mecanismo new
seguido do tipo e da quantidade de elementos que dever ter o vetor. Pronto! O cdigo abaixo
reflete este procedimento:
//definindo a capacidade do vetor
int capacity = 10;
//instanciando o vetor
Integer[] vetor = new Integer[capacity];

Sabendo que em uma fila o elemento entra atrs dos demais elementos j existentes, ento
necessrio conhecer qual a posio do ltimo elemento iultimo . A partir desta informao possvel
14

definir qual posio assumir o novo elemento ao entrar na fila (inovo = iultimo + 1). Bem, mas se
a fila estiver cheia o que ocorrer ao tentar inserir um novo elemento? E se estiver vazia?
Se estiver cheia o novo elemento no poder entrar na fila, logo nada ocorrer! Isto significa
que necessrio testar antes se a quantidade efetiva de elementos na fila igual a sua capacidade.
Sendo isto verdadeiro, ento simplesmente nada ser feito. Se a fila estiver vazia, a posio de
entrada do elemento ser inovo = 0. Aps a incluso o valor da posio do ltimo elemento ser
tambm iultimo = 0. O algortmo resultante deste raciocnio segue abaixo:
//varivel da posio do ltimo elemento (inicialmente 1)
private int i_last = 1;
//definindo o vetor
private Integer[] vetor;
//
...
//operao de criar uma fila
public void create(int capacity){
//instanciando o vetor
vetor = new Integer[capacity];
}
//
...
//definindo a capacidade do vetor
public void enqueue(int element){
//verifica se a fila est cheia
if (isFull()){
return;//sai da operao imediatamente
}
//definir a posicao de entrada
int i_new;
if (isEmpty()){
i_new = 0;
}
else {
i_new = i_last + 1;
}
//incluir o novo elemento
vetor[i_new] = element;
//incrementar a quantidade de elementos na fila
count = count + 1;
//atualizar a posio do ltimo elemento
i_last = i_new;
}

15

Para saber se a fila est cheia ou vazia necessrio conhecer a quantidade de elementos efetivamente inseridos na fila (count). No primeiro caso (fila cheia) este valor deve ser comparado com a
capacidade da fila (capacity), sendo verdadeiro se count = capacity e count > 0. Para o segundo
caso, basta verificar se este valor count = 0. Traduzindo este raciocnio para os cdigos java
tm-se:
//varivel para armazenar a capacidade da fila
private int capacity = 0;
//varivel para armazenar a quantidade de elementos na fila
private int count = 0;
//
...
//verifica se a fila est vazia
public boolean isEmpty(){
return (count == 0);
}
//
...
//verifica se a fila est cheia
public boolean isFull(){
return !isEmpty() && (count == capacity);
}
//
...
//verifica quantos elementos
//esto efetivamente na fila
public int count(){
return count;
}

O elemento que ser removido da fila sempre ser o primeiro, ou seja, o elemento que ser
excludo assume a posio iexclusao = 0, exceto quando a fila vazia. Neste caso, quando a fila for
vazia, esta operao no dever fazer nada.
Aps a remoo do primeiro elemento ficar um buraco na fila e ser necessrio realizar a
organizao da fila, onde o segundo elemento assumir a primeira posio, o terceiro assumir a
segunda posio e assim por diante. Depois deve-se atualizar a quantidade de elementos que esto
na fila e a posio do ltimo elemento.
Para evitar que a operao de organizao seja erroneamente chamada por outra operao, devese criar uma varivel de controle dequeued. Esta varivel de controle, do tipo lgica, inicialmente
assume o valor de f alse e alterado para true quando for realizado a excluso de um elemento da
fila, voltando ao seu valor inicial aps a fila est organizada.

16

//varivel de controle de organizao


private boolean dequeued = false;
...
//operao de organizao da fila
//depois de uma excluso
public void organize(){
//verificar se foi excluido elementos
if (!dequeued) return;
//iniciar a organizao
for (int i = 0; i < count; i++){
vetor[i] = vetor[i+1];
vetor[i+1] = null;
}
//atualizar a posio do ltimo elemento
i_last = count 1;
//atualizar a varivel de controle
dequeued = false;
}
//
...
//excluir um elemento da fila
public void dequeue(){
//verificar se a fila vazia
if (isEmpty()) return;
//excluir um elemento
vetor[0] = null;
//atualizar a contagem
count = count 1;
//organizar os elementos
dequeued = true;
organize();
}

Seguindo este raciocnio tm-se a implementao da primeira estrutura de dados do tipo fila.
Agora necessrio testar o seu funcionamento e para isto deve-se criar uma classe de execuo em
Java e usar uma instncia da implementao de IQueue conforme se segue na prxima seo.

17

EXCEES EM JAVA
possvel utilizar o disparo de excees para melhorar a codificao de erros. Para isto basta
utilizar o mecanismo textbfthrow e uma instncia de um objeto de exceo (IOException, Exception, RuntimeException, etc) e incluir o tipo de exceo na assinatura do mtodo. Exemplo:
public class MyTest{
public void operation(int t) throws Exception{
if (t < 0) {
throw new Exception("O valor de t no pode ser negativo.");
}
}
}

Exerccio Resolvido
Questo 3.2.1 - Crie uma fila que tenha capacidade para 10 elementos do tipo de dado inteiro
e realize os seguintes comandos:
Operaes

Resultados Esperados

enqueue(10)
enqueue(20)
dequeue()
enqueue(30)
dequeue()
dequeue()

10
10 20
20
20 30
30

Resoluo
Adotando a implementao da interface conforme discutido na seo anterior basta fazer uso
dessa implementao seguindo a sequncia de operaes solicitadas. O cdigo abaixo produz o
resultado desejado.
Questo 3.2.2 - Crie um programa que receba os comandos de insero e excluso de elementos
contidos no quadro abaixo. O tipo de dado armazenado na fila do tipo nmerico (inteiro). Para
18

Figure 3.5: Cdigo de execuo da classe Queue para o exerccio 3.01


identificar quando dever ser realizado uma excluso ser adotado o valor D dentre os comandos.
Exemplo: para os comandos 3 2 7, tm-se ao final uma fila de tamanho 3 com os elementos {3, 2,
7}; para os comandos 4 1 2 D 5, tm-se ao final uma fila com 4 elementos, sendo estes {1, 2, 5}.
Comandos

Resultados Esperados

25DD7
7
9783D
783
1D2D99D7 97
588DDD1
1
Resoluo
O cdigo abaixo produz o resultado desejado.
Questo 3.2.3 - Crie um programa que receba os comandos de insero e excluso de elementos
contidos no quadro abaixo, sendo que o primeiro valor enviado deve corresponder a capacidade da
fila. O tipo de dado armazenado na fila do tipo nmerico (inteiro). De forma similar a questo
3.02, ser adotado o valor D dentre os comandos para realizar a operao de excluso.

19

Figure 3.6: Cdigo de execuo da classe Queue para o exerccio 3.02


Comandos

Resultados Esperados

41DD7893D 893
278DD34D1 41
1D2D9DD7
7
579DDD1
1
Resoluo
O cdigo abaixo produz o resultado desejado.

ACESSO AOS CDIGOS FONTES


Para ter acesso direto aos cdigos, acesse o
<http://github.com/arigarcia/ifpb-estruturadedados>.

20

Figure 3.7: Cdigo de execuo da classe Queue para o exerccio 3.03

3.3

Fila Circular

At agora foi apresentado a idia de que ao remover um elemento da fila os demais elementos
so organizados para que no fiquem buracos na fila. Como j afirmado antes, do ponto de vista
computacional, este procedimento uma soluo interessante para alguns problemas, no entanto,
quando a quantidade de elementos na fila muito grande e diversas operaes de entrada e sada
so necessrias para realizar a operao, esta soluo pode se tornar invivel.
Isto ocorre porque a cada elemento removido necessrio percorrer todos os elementos da fila
realocando-os para sua posio atual i para a posio anterior i 1. Isto significa que a cada
remoo ser necessrio realizar n operaes de realocao, onde n o nmero de elementos
efetivos na fila (vide algoritmo 4).
Uma soluo mais eficiente do que ficar realocando todos os elementos da fila aps cada remoo o de modificar a referncia do que primeiro da fila e ltimo da fila. Isto pode soar
complicado, mas bem simples.
21

Algortmo 4 Organize: organizar a fila


1: procedimento ORGANIZE
2:
se matriz[0] 6= nulo ento
. sair do procedimento se o ponto de entrada no for nulo
3:
sair
4:
fim se
5:
para i=1 a quant faa
6:
matriz[i 1] matriz[i]
7:
fim para
8:
matriz[iultimo ] nulo
9: fim procedimento
Por exemplo, em um sistema de atendimento que adota cadeiras como demarcao de posies
(figura 3.8) em uma fila (da 1 a n-sima posio), adotando o procedimento de reorganizao, faz
com que, a cada pessoa atendida (saiu da fila), abra espao na primeira cadeira e force as pessoas a
sairem de suas posies e assumam sempre a cadeira vaga mais a sua frente.

Figure 3.8: Ilustrao de uma fila de atendimento demarcada com cadeiras


Tudo bem, funciona, mas esta no a nica soluo!
Observe que este procedimento faz com que as pessoas se desloquem, mantendo a referncia
de quem o primeiro e o ltimo da fila como sendo os elementos que assumem a primeira cadeira
e a n-sima cadeira, respectivamente.
Bem, e se todas as pessoas ficassem nas suas cadeiras? A soluo agora seria a de controlar
qual so as cadeiras que referem-se ao primeiro da fila e ao ltimo da fila. Com estas informaes
a fila continua mantendo suas caractersticas, principalmente a que se refere aos pontos de entrada
(depois do ltimo) e de sada (primeiro).
Ao se adotar esta soluo possvel entender que o primeiro elemento da a entrar na fila assume
a cadeira que ocupa a posio 1. Ao ser atendido, o local fica vago e torna-se, na verdade, a outra
extemidade da fila. Continuando com esse processo, quando o primeiro elemento ocupar a cadeira
22

da posio n e for atendido o primeiro da fila ser novamente o elemento que ocupa a cadeira na
posio 1, dando a impresso de que a fila circular.

Figure 3.9: Ilustrao do funcionamento de uma fila circular


Para ilustrar melhor o que isto que dizer, na figura 3.9, so apresentados diveros passos de
incluso e remoo de elementos na fila circular. Nesta fila, que possui capacidade para 8 elementos
e inicia o processo com trs elementos: A, B e C, os elementos so inseridos e removidos de
forma a criar uma movimentao de sentido horrio nos referenciais de Inicial e Final. No incio
as posies do primeiro elemento (referenciado como incio) igual a 1 e de ltimo elemento
(referenciado como final) igual a 3. Quando inserido mais dois elementos, D e E, o ltimo
elemento assume a posio 5. Quando o elemento A removido, B assume o referencial de incio
da fila, que agora est na posio 2. Depois disto F e G entram na fila e B sai, fazendo com que
o incio da fila seja agora representado pela posio 3 e o final da fila pela posio 7. Por fim,
mais trs elementos entram na fila (H, I e K) e um sai (C), fazendo com a posio de final da
fila assuma uma posio com valor menor que a de incio da fila, 2 e 4, respectivamente. Este o
fato que fornece a impresso de que as posies de incio e final da fila circulam e por isto que
chamada de fila circular.

23

TERMOS ADOTADOS POR OUTROS AUTORES


Uma fila dotada de duas extremidades, uma das quais para entrada de elementos e a outra
para sada. Alguns autores chamam estes pontos de entrada e de sada como: cabea (head)
e calda (tail); incio (begin) e final (end); frente (front) e retaguarda (rear) ou entrada (input)
ou sada (output). Independente de como sejam chamados sempre ocupara a mesma regra: o
primeiro da fila o primeiro que sa e o prximo a chegar sempre ocupara o espao vago atrs
do ltimo da fila.

Matemticamente, para o caso de vetores, pode-se afirmar que a posio do incio ou final so
modificados de acordo com a remoo ou insero de elementos nesta fila, podendo retornar ao
valor inicial quanto a posio de referncia na fila for igual ao valor da capacidade da fila menos
um. Logo, considerando f (u) como o valor da nova posio de entrada na fila, onde u a posio
do ltimo elemento, e n como a quantidade mxima de elementos na fila (capacidade), tem-se:

0
, para u = n 1
u + 1 , caso contrario.

f (u) =

(3.2)

Da mesma maneira, pode-se calcular o valor do prximo ponto de sada da fila, neste caso, g(v)
ser a nova posio de sada, onde v a posio do primeiro elemento na fila:

(
g(v) =

0
, para v = n 1
v + 1 , caso contrario.

(3.3)

A similaridade das duas funes possibilita entender que o clculo se resume a definir a nova
posio, seja de entrada ou sada. Pensando assim, o algoritmo 5 pode ser usado para realizar este
calculo.
Algortmo 5 IncIndex: incrementar a posio i referente ao incio ou final da fila
1: n capacidade
2: se i = n 1 ento
. considerando i=0,1,2,3. . . n-1
3:
f 0
4: seno
5:
f i+1
6: fim se

24

Exerccio Resolvido
Questo 3.3.1 - Baseado na classe que representa a fila do Queue.java crie a classe CircularQueue fazendo a modificao dos mtodos enqueue e dequeue para que estes representem o
comportamento da fila circular, depois adote os valores abaixo para testes.
Operaes

Resultados Esperados

enqueue(10)
enqueue(20)
dequeue()
enqueue(30)
dequeue()
dequeue()
enqueue(50)

10 XX XX XX
10 20 XX XX
XX 20 XX XX
XX 20 30 XX
XX XX 30 XX
XX XX XX XX
XX XX XX 50

Incio

Final

0
0
1
1
2
3
3

0
1
1
2
2
2
3

Resoluo
Passos para a resoluo:
criar a interface de aes da fila circular ICircularQueue;
implementar a interface de aes e adotar o nome de CircularQueue;
realizar os testes
O cdigo resultante da construo da interface o seguinte:

Figure 3.10: Cdigo da interface ICircularQueue solicitada na Questo 3.3.1

25

A implementao desta interface pode ser vista no cdigo a seguir:

Figure 3.11: Implementao da interface ICircularQueue solicitada na Questo 3.3.1


A classe a abaixo apresentada atende aos testes solicitados.

Figure 3.12: Classe usada para execuo dos testes solicitados na Questo 3.3.1

Questo 3.3.2 - Considerando adoo de fila circular, resolva as questes 3.2.1, 3.2.2 e 3.2.3 .
26

Resoluo Passos para a resoluo:


Recrie a classe de exercuo para cada questo adotando;
Cpie o cdigo que est dentro do mtodo main;
Altere o nome da classe Queue para CircularQueue;
Execute o cdigo e observe o resultado.

ACESSO AOS CDIGOS FONTES


Para ter acesso direto aos cdigos, acesse o
<http://github.com/arigarcia/ifpb-estruturadedados>.

27

3.4

Fila Encadeada

Quando se limita a capacidade de uma fila um dos seguintes casos podem ser observados: a
capacidade poder estar inferior a demanda implicando em perda de elementos a serem processados
ou a capacidade poder estar muito superior a demanda implicando em alocao desnecessria de
recursos.
O primeiro caso pode ser rapidamente comparado ao de um atendimento mdico em um posto
de sade, onde um nmero limitado de senhas so disponibilizadas. As senhas so entregues antes
que o profissional chegue para o atendimento e a cada pessoa que vai chegando. Isto repetido at
que no haja mais nenhuma senha disponvel. Aps isto, os prximos que chegarem no tero mais
como serem atendidos criando insatisfaes e situaes de conflito com a administrao do posto
de sade.
Para saber qual a capacidade de atendimento de um posto de sade, a administrao leva em
considerao o tempo disponvel do profissional e o tempo que demora cada atendimento. Este
nmero est sujeito ainda a restries ligadas a quantidade de recursos materiais disponveis no
posto de sade e aos limitados recursos financeiros disponibilizados pela Secretaria de Sade do
Municpio ou Estado.
O segundo caso, em geral, o reflexo de um erro de planejamento ou de uma alta sazonalidade
na demanda por um servio. Seja como for, os recursos esto sendo utilizados sem efetivade
fazendo com que o custo de disponibilizao de um servio seja majorado. Apesar desta majorao
no custo do servio, quando esta abordagem adotada intensionalmente, porque a perda de
elementos por falta de atendimento bem mais cara.
A definio da capacidade, neste caso, feita com base em informaes erradas ou desconhecidas obtidas durante o planejamento do servio ou na quantidade de elementos que devero ser
atendidos quando a demanda for muito alta.
No primeiro caso possvel resolver o problema simplesmente alocando mais recursos e ampliando um a capacidade da fila e do atendimento. Claro que isto requer um estudo e uma planejamento prvio, mas simples de ser executado. No segundo caso, diferente do que possa-se
imaginar, no suficiente diminuir a capacidade da fila e a quantidade de recursos disponibilizados, uma vez que pode ser ainda mais caro perder elementos. Por causa disto, faz-se necessrio
criar mecanismos que providenciem modificaes na capacidade da fila e do atendimento de forma
a garantir que nenhum elemento seja perdido e que reduza o custo do servio.
Na computao, uma das maneiras de fazer com que as filas cresam de acordo com a demanda adotando uma abordagem de encadeamento. Esta abordagem remove a preocupao com
o sequnciamento de elementos requerendo que cada elemento tenha o conhecimento de qual fila
pertence, qual sua posio na fila (primeiro ou ltimo) e quem o prximo elemento.
28

Figure 3.13: Representao de uma fila encadeada


Na figura 3.4 pode-se observar duas divises na caixa que representa um elemento da fila. Isto
intensional e denota que cada elemento deve possuir dois tipos de dados: o primeiro referente
ao elemento includo na fila e o segundo sobre a fila (posio atual, se o primeiro ou o ltimo
elemento, qual o prximo elemento e etc.). Esta abordagem elimina a necessidade de utilizao de
um vetor, mas requer um melhor gerenciamento da fila.
O gerenciamento da fila, como de qualquer outra estrutura de dados, realizado sobre o Tipo
Abstrato de Dados - TAD, que formado por uma coleo de dados a serem armazenados e um
conjunto de operaes que podem ser aplicados para manipulao desses dados. Essa manipulao,
para fins de armazenamento e recuperao, deve ser realizada exclusivamente por estas operaes.
O TAD tem como objetivo separar a definio conceitual de uma estrutura de dados de sua implementao e podem ser modelados matematicamente da seguinte forma:

T AD = (v, o)

(3.4)

onde v o conjunto de valores e o o conjunto de operadores.


Apesar de somente agora ter sido apresentado formalmente, o TAD sempre foi adotado antes,
de forma intuitiva e em conformidade com o modelo matemtico a seguir:
T ADf ila = (v, o)

(3.5)

onde:
v = {f irst, last, quantity, capacity, vector}
o = {enqueue, dequeue, isF ull, isEmpty, head, tail, count, next}

29

(3.6)

Conforme pode ser observado, o TAD de uma fila, independente se ela implementada com
algoritmo de realocao ou circular, possui dados que caracterizam o conceito principal de uma
fila (primeiro a entrar, primeiro a sair e duas extremidades) e a sua abordagem de gerenciamento
quanto ao armazenamento e a manipulao dos dados (capacidade limitada, verificao de fila cheia
ou vazia, etc).
Em Java, o TAD pode ser expresso no formato de uma classe, onde os atributos da classe
representam os dados e os mtodos representam os operadores, conforme o cdigo apresentado na
figura 3.4.

Figure 3.14: Codificao de um TAD de Fila na linguagem Java


Para o caso de uma fila encadeada o TAD dever manter o conceito principal da fila e adotar
outros valores e operaes que caracterizem a abordagem de encadeamento. O encadeamento
feito fazendo com que cada elemento conhea o prximo elemento da fila, necessitando apenas que
o TAD conhea o primeiro elemento e o ltimo. Assim sendo, o TAD de uma fila encadeada ser
codificado da seguinte forma:

30

Figure 3.15: Codificao de um TAD de Fila Encadeada na linguagem Java


Uma vez conhecido o TAD de uma fila encadeada necessrio agora pensar no seu algoritmo,
na sua implementao. O que necessrio entender, antes de iniciar a construo do algoritmo
o que mudou em relao ao que j foi feito antes. Em primeiro lugar, pode-se observar que os
valores que representavam o primeiro e o ltimo elementos da fila era referenciado pelo ndice
que ocupavam no vetor. No caso do TADFilaEncadeada a referncia do primeiro e do ltimo
elemento feita diretamente atravs do acesso aos prprios elementos. Em segundo lugar, foram
eliminados dois atributos antes existentes, o que limitava a capacidade da fila e o vetor que fornecia
as posies dos elementos na fila. Por fim, a estrutura do elemento, que antes era autocontido e
agora necessrio que seja adicionado um dado adicional, a referncia do prximo elemento. Cada
elemento ento dever possuir a seguinte estrutura:

Figure 3.16: Codificao do Elemento e da TAD da Fila Encadeada na linguagem Java


Para incluir um elemento na fila ser necessrio apenas referenciar o o novo elemento no ltimo
elemento e na varivel de controle do TAD da fila encadeada. O algoritmo a seguir reflete isto:
31

Algortmo 6 Enqueue: incluir um novo objeto na fila encadeada


1: procedimento ENQUEUE(objeto)
2:
elemento newElemento
3:
elemento.valor objeto
4:
elemento.proximo nulo
5:
se last = nulo ento
6:
primeiro elemento
7:
ultimo elemento
8:
seno
9:
ultimo.proximo elemento
10:
ultimo elemento
11:
fim se
12:
quantidade quantidade + 1
13: fim procedimento
A remoo de do primeiro elemento implica em recuperar a referncia do prximo elemento da
fila (f irst.next) e atribuir na variavel de controle do primeiro elemento no TAD, conforme pode
ser observado no algoritmo abaixo:
Algortmo 7 Dequeue: remover objeto da fila encadeada
1: procedimento DEQUEUE
2:
se primeiro = nulo ento
3:
sair
4:
seno
5:
elemento primeiro.proximo
6:
primeiro elemento
7:
quantidade quantidade 1
8:
fim se
9: fim procedimento

Exerccio Proposto
Questo 3.4.1 - Qual o TAD de uma fila com reorganizao de posies? E de uma fila ciruclar?

Questo 3.4.2 - Implemente os mtodos begin, end, isF ull, isEmpty, count e next da fila
encadeada.

32

Questo 3.4.3 - Adotando uma fila encadeada realize as operaes solicitadas no quando
abaixo:
Operaes

Resultados Esperados

enqueue(10)
enqueue(20)
dequeue()
enqueue(30)
dequeue()
dequeue()
enqueue(50)

10
10 20
20
20 30
30
50

Primeiro

ltimo

Quantidade

10
10
20
20
30
nulo
50

10
20
20
30
30
nulo
50

1
2
1
2
1
0
1

Questo 3.4.4 - Pesquise na internet os principais pontos que diferem uma fila circular (de
alocao esttica) de uma fila encadeada (de alocao dinmica) reportando quais as vantagens e
desvatagens de cada uma.

33

Referncias

34

Potrebbero piacerti anche