Você está na página 1de 16

'

ESTRUTURAS DE DADOS BASICAS EM JAVA


Jos de Siqueira e UFMG - ICEx - DCC 1o semestre de 2005

&

'

Estruturas de Dados Bsicas em Java a

O Tipo Abstrato de Dados Pilha


O TAD pilha tem quase as mesmas operaoes c apresentadas anteriormente: 1. empilha(o): insere o objeto o no topo da pilha. Entrada: objeto. Sa da: nenhuma. 2. desempilha(): retira o objeto no topo da pilha e o roetorna; ocorre erro se a pilha estiver vazia. Entrada: nenhuma. Sa da: objeto. 3. tamanho(): retorna o nmero de objetos na u pilha. Entrada: nenhuma. Sa da: inteiro. 4. vazia(): Retorna um booleano indicando se a pilha est vazia. a Entrada: nenhuma. Sa da: booleano. 5. topo(): Retorna o objeto no topo da pilha, sem retir-lo; ocorre um erro se a pilha estiver a vazia. Entrada: nenhuma. Sa da: objeto.
&

Jos de Siqueira e

'

Estruturas de Dados Bsicas em Java a

Uma interface para pilhas em Java


Em Java, j existe a classe para o TAD pilha: a java.util.Stack. Os mtodos dispon e veis nesta classe, entre outros, so: push(obj), pop(), equivalentes a a empilha(o) e desempilha() e peek(), equivalente a topo(), tamanho() e vazia(). Os mtodos pop() e peek() lanam a exceao e c c StackEmptyException se a pilha estiver vazia quando eles so chamados. a Apesar de j existir esta classe em Java, aqui a estamos interessados em aprender como projetar e implementar uma pilha e uma la em Java. A implementaao de um TAD em Java envolve c dois passos: 1. a deniao de uma API (Application c Programming Interface) que descreve os nomes dos mtodos que o TAD oferece, como e eles so declarados e como so usados. a a 2. uma ou mais implementaoes concretas dos c mtodos descritos na interface (API) e associada com o TAD.
&

Jos de Siqueira e

'

Estruturas de Dados Bsicas em Java a

public interface Pilha { /* retorna o nmero de itens na pilha */ u public int tamanho(); /* retorna true se a pilha est vazia, false seno */ a a public boolean vazia(); /*retorna, sem remov-lo, o item do topo da pilha; e lana StackEmptyException se a pilha estiver vazia*/ c public Object topo() throws StackEmptyException; /* insere um item, passado em parmetro, no topo a da pilha */ public void empilha(Object element); /* remove e retorna o item no topo da pilha; lana c StackEmptyException se a pilha estiver vazia*/ public Object desempilha() throws StackEmptyException; } /* Exceoes lanadas quando se tenta usar as operaoes c c c em uma pilha vazia so tratadas aqui*/ a public class StackEmptyException extends RuntimeException { public StackEmptyException (String erro) { super(erro); } }
&

Jos de Siqueira e

'

Estruturas de Dados Bsicas em Java a

Uma implementaao baseada em vetores c


Nesta implementaao baseada em vetores, como o c vetor alocado estaticamente, ao tentar empilhar e um objeto em uma pilha cheia, devemos lanar c uma exceao StackFullExcpetion. c Esta exceao no foi denida no TAD Pilha por c a ser espec ca desta implementaao. c
/* Implementaao da interface Pilha usando um c vetor de tamanho xo. Uma exceao lanada ao c e c tentar empilhar um objeto em uma pilha cheia. */ public class PilhaComVetor implements Pilha { /* Tamanho mximo xo do vetor usado como a pilha */ public static final int CapacidadeMax = 1000; /* Capacidade da pilha */ private int Capacidade; /* Vetor usado como pilha */ private Object P[ ]; /* ndice do elemento do topo da pilha */ private int topo = -1;
&

Jos de Siqueira e

'

Estruturas de Dados Bsicas em Java a

/* inicia a pilha para usar um vetor com tamanho mximo CapacidadeMax */ a public PilhaComVetor() { this(CapacidadeMax); } /* inicia a pilha para um arranjo com o tamanho fornecido; o parmetro o tamanho do vetor */ a e public PilhaComVetor(int tam) { Capacidade = tam; P = new Object[Capacidade]; } public int tamanho() { return(topo + 1); } public boolean vazia() { return(topo < 0); } public void empilha(Object obj) throws StackFullException { if (tamanho() == Capacidade) throw new StackFullException(Pilha cheia!); P[++topo] = obj; }
&

Jos de Siqueira e

'

Estruturas de Dados Bsicas em Java a

public Object desempilha() throws StackEmptyException { Object elemento; if (vazia()) throw new StackEmptyException(Pilha vazia!); elemento = P[topo]; P[topo] = null; // Libera P[topo] para a // coleta de lixo topo--; return elemento; } }

A pilha declarada acima genrica, pois os e e elementos so instncias da classe Object de Java. a a Pode-se armazenar qualquer objeto na pilha, pois todas as classes Java herdam da classe Object. Assim, podemos empilhar objetos das classes Integer, Estudante ou at mesmo Planetas. e No entanto, ao desempilhar, preciso fazer uma e converso para a classe espec a ca a que o objeto realmente pertence, como mostra o trecho de programa abaixo:
&

Jos de Siqueira e

'

Estruturas de Dados Bsicas em Java a

public static Integer[] inverte(Integer[] a) { PilhaComVetor P = new PilhaComVetor(a.length); Integer[] b = new Integer[a.length]; for (int i = 0; i < a.length; i++) P.empilha(a[i]); for (int i = 0; i < a.length; i++) b[i] = (Integer) (P.desempilha()); return b; }

O TAD la em Java
As operaoes do TAD la so: c a 1. insere(o): insere o obejto o no m da la. Entrada: objeto. Sa da: nenhuma. 2. retira(o): retira e retorna o objeto do in da cio la. Lana uma exceao se a la estiver vazia. c c Entrada: nenhuma. Sa da: objeto. 3. tamanho(): retorna o nmero de objetos na u la. Entrada: nenhuma. Sa da: inteiro.
&

Jos de Siqueira e

'

Estruturas de Dados Bsicas em Java a

4. vazia(): retorna um booleano indicando se a la est vaiza ou no. a a Entrada: nenhuma. Sa da: booleano. 5. frente(): retorna o objeto no in da la, cio sem retir-lo.Lana uma exceao se a la a c c estiver vazia. Entrada: nenhuma. Sa da: objeto.
public interface Fila { /* retorna o nmero de itens na la */ u prublic int tamanho(); /* retorna true se a la estiver vazia, false seno */ a public boolean vazia(); /* retorna o item a frente na la; lana ` c QueueEmptyException se a la estiver vazia */ public Object frente() throws QueueEmptyException; /* insere elemento no nal da la */ public void insere(Object item); /* remove e retorna o item a frente da la; lana ` c QueueEmptyException se a la estiver vazia */ public Object retira() throws QueueEmptyException;

&

Jos de Siqueira e

'

Estruturas de Dados Bsicas em Java a

Implementaao de las com arranjos c


Para implementar uma la em um arranjo de tamanho N , melhor utilizar uma la circular. e Para isso, temos dois apontadores i e f que indicam o in e o m da la. cio A la est vazia quando i = f e f indica a a prxima posiao livre. o c Problema: O que acontece quando f = N ? O que fazer neste caso? A implementaao da circularidade simples se o c e incremento for feito como (i + 1) mod N ou (f + 1) mod N . Problema: como distinguir que a la est cheia? a Por exemplo, deixando sempre uma casa vazia entre o m e o in cio. Ou inserindo, no mximo, N 1 elementos. a

&

Jos de Siqueira e

'

Estruturas de Dados Bsicas em Java a

Algoritmo tamanho(); retorna (N-i+f) mod N; Algoritmo vazia(); retorna (i=f); Algoritmo frente(); se vazia() ent~o lanar uma a c QueueEmptyException; retorna F[i]; Algoritmo retira(); se vazia() ent~o lanar uma a c QueueEmptyException ; aux F[i]; F[i] null; i (i+1) mod N; retorna aux; Algoritmo insere(o); se tamanho() = N - 1 ent~o lanar uma a c QueueFullException; F[f] o; f (f+1) mod N;
&

Jos de Siqueira e

10

'

Estruturas de Dados Bsicas em Java a

Listas encadeadas em Java


public class N { o // Variveis de inst^ncia a a private Object item; private N prox; o // Construtores simples public N() { o this(null,null); } public N(Object i, N n) { o o item = i; prox = n; } // Mtodos de acesso e Object retItem() { return item; } N retProx() { o return prox; } // Modificadores void posItem(Object novoItem) { item = novoItem; } void posProx(N novoN) { o o prox = novoN; o } }
&

Jos de Siqueira e

11

'

Estruturas de Dados Bsicas em Java a

Implementaao de uma pilha com c listas encadeadas


public class PilhaEncadeada implements Pilha { private N topo; // refer^ncia para o n do o e o // topo private int tam; // nmero de itens na pilha u public PilhaEncadeada() { topo = null; tam = 0; } public int tamanho() { return tam; } public boolean vazia() { return (topo == null); } public void empilha(Object item) { N v = new N(); // cria um novo n o o o v.posItem(item); v.posProx(topo); // encadeia o novo n o topo = v; tam++; }
&

Jos de Siqueira e

12

'

Estruturas de Dados Bsicas em Java a

public Object topo() throws StackEmptyException { if (vazia()) throw new StackEmptyException(Pilha est vazia.); a return topo.retItem(); } public Object desempilha() throws StackEmptyException { if (vazia()) throw new StackEmptyException(Pilha est vazia.); a Object aux = topo.retItem(); topo = topo.retProx; // aponta para o // prximo n o o tam--; return aux; } }

&

Jos de Siqueira e

13

'

Estruturas de Dados Bsicas em Java a

Implementaao de uma la com c listas encadeadas


Apresentamos apenas a implementaao de dois c mtodos principais. e As declaraoes de classe e os outros mtodos para c e a implementaao de las com listas encadeadas c so deixadas como exerc a cio.
public void insere(Object obj) { N n = new N(); o o o n.posItem(obj); o n.posProx(null); // o n inserido ser o do o o a // final da lista if (tam == 0) //inserao em uma fila vazia c~ primeiro = n o else ultimo.posProx(n); // insere n no final o o // da fila ultimo = n; // aponta para o n inserido o o tam++; }
&

Jos de Siqueira e

14

'

Estruturas de Dados Bsicas em Java a

public Object retira() throws QueueEmptyException { Object obj; if (tam == 0) throw new QueueEmptyException (Fila est vazia.); a obj = primeiro.retItem(); primeiro = primeiro.retProx(); tam--; if (tam == 0) ultimo = null // a fila ficou // vazia return obj; }

&

Jos de Siqueira e

15

Você também pode gostar