Dulce Mota /Helena Leit o Tipos Abstractos de Dados (ADT) Paradigmas de Programao Estruturas construdas para armazenar determinados tipos de dados e que especificam operaes que permitem a manipulao desses dados. Estudaremos duas das mais simples que se encontram entre as estruturas mais importantes: Pilha (stack) Fila (queue) Veremos a definio destas ADTs de uma forma geral e daremos duas alternativas para implementao : Array e Lista Ligada Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 2 Dulce Mota /Helena Leit o PILHA (STACK): Paradigmas de Programao Contentor de objectos em que o processo de insero e remoo de elementos feito de acordo com o princpio last-in- first-out (LIFO) Em qualquer ocasio pode ser inserido um novo objecto e ser colocado na estrutura de modo que quando for necessrio retirar um elemento, sair o ltimo que foi inserido. (Analogia: pilha de pratos) Aplicaes: Armazenamento dos endereos visitados num navegador web Mecanismo undo dos editores de texto Recursividade .... .... Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 3 Dulce Mota /Helena Leit o PILHA (STACK): Paradigmas de Programao Operaes : push(obj) - Inserir objecto obj no topo da pilha pop() - Remover objecto do topo da pilha top() - Consultar objecto do topo da pilha (sem o remover) isEmpty() - Verificar se a pilha est vazia size() - Devolve o nmero de objectos na pilha Nota: a pilha s tem um acesso, quer para remover objectos quer para inserir objectos. Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 4 Dulce Mota /Helena Leit o PILHA --- Implementao em Java usando arrays Paradigmas de Programao Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 5 Dulce Mota /Helena Leit o PILHA --- Implementao em Java usando arrays Paradigmas de Programao public class StackArray { private static final int CAPACIDADE=1000; //dimenso do array por omisso private int capacidade; private int tamActual=-1; private Object contentor[]; public StackArray() { this(CAPACIDADE); } public StackArray(int capac) { capacidade=capac; contentor=new Object[capacidade]; } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 6 Dulce Mota /Helena Leit o Paradigmas de Programao public int size() { return tamActual+1; } public boolean isEmpty() { return tamActual<0; } public Object top() throws EmptyException { if(isEmpty()) return null; else return contentor[tamActual]; } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 7 Dulce Mota /Helena Leit o Paradigmas de Programao public void push(Object obj) throws FullException { if(size()==capacidade) throw new FullException("Stack completa"); else { tamActual++; contentor[tamActual]=obj; } } public Object pop() throws EmptyException { if(isEmpty()) return null; else { Object obj=contentor[tamActual]; contentor[tamActual]=null; tamActual--; return obj; } }} Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 8 Dulce Mota /Helena Leit o Paradigmas de Programao O mtodo push() lana a excepo FullException (quando o array de implementao da stack ultrapassa a capacidade mxima) FullException Exception Como a classe da excepo subclasse de Exception, sempre que utilizarmos o mtodos push() teremos que o fazer dentro de um bloco try...catch Cdigo da classe FullException: public class FullException extends Exception { public FullException(String erro) { super(erro); } } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 9 Dulce Mota /Helena Leit o FILA (QUEUE): Paradigmas de Programao Contentor de objectos em que o processo de insero e remoo de elementos feito de acordo com o princpio first-in- first-out (FIFO) Em qualquer ocasio pode ser inserido um novo objecto e ser colocado na estrutura (fim da fila) de modo que quando for necessrio retirar um elemento, sair o primeiro que foi inserido, que se encontra no incio da fila. (Analogia: fila para entrada no autocarro) Aplicaes: Processamento de informao em que a ordem obedea ao princpio FIFO (Simulaes). Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 10 Dulce Mota /Helena Leit o FILA (cont) Paradigmas de Programao Operaes : enqueue(obj) - Inserir objecto obj no fim da fila dequeue() - Remover objecto do incio da fila front() - Consultar objecto do incio da fila (sem o remover) isEmpty() - Verificar se a fila est vazia size() - Devolve o nmero de objectos na fila Nota: a fila tem dois acessos ,incio para remover objectos e fim para inserir objectos. Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 11 Dulce Mota /Helena Leit o FILA (cont) Paradigmas de Programao Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 12 Dulce Mota /Helena Leit o FILA ----- implementao em Java usando arrays Paradigmas de Programao public class QueueArray { private static final int CAPACIDADE=1000;// private int capacidade; private int tamActual=-1; private Object contentor[]; public QueueArray() { this(CAPACIDADE); } public QueueArray(int capac) { capacidade=capac; contentor=new Object[capacidade]; } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 13 Dulce Mota /Helena Leit o FILA ----- implementao em Java usando arrays Paradigmas de Programao public int tamanho() { return tamActual+1; } public boolean isEmpty() { return tamActual<0; } public Object topo() { if(isEmpty()) return null; else return contentor[tamActual]; } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 14 Dulce Mota /Helena Leit o FILA ----- implementao em Java usando arrays Paradigmas de Programao //junta objecto no fim da queue public void enqueue(Object obj) throws QueueFullException { if(tamanho()==capacidade) throw new QueueFullException("Queue completa"); else { tamActual++; contentor[tamActual]=obj; } } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 15 Dulce Mota /Helena Leit o FILA ----- implementao em Java usando arrays Paradigmas de Programao //retira objecto do inicio da queue public Object dequeue(){ if(isEmpty()) return null; else { Object obj=contentor[0]; for(int i=0;i<tamActual-1;i++) { //faz shift para a esquerda dos elementos do array contentor[i]=contentor[i+1]; } contentor[tamActual]=null; tamActual--; return obj; } } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 16 Dulce Mota /Helena Leit o LISTA SIMPLESMENTE LIGADA Paradigmas de Programao Vimos como implementar os tipos abstractos de dados, pilha e fila, usando arrays. Vantagem desta implementao: Simplicidade Desvantagem Pouco dinmica, necessrio fixar o nmero mximo de elementos que a estrutura pode comportar. Para colmatar esta desvantagem vamos usar uma implementao alternativa ----- lista simplesmente ligada Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 17 Dulce Mota /Helena Leit o LISTA SIMPLESMENTE LIGADA Paradigmas de Programao Lista simplesmente ligada uma coleco de ns . Cada n um objecto composto por dois campos 1. elemento -- contedo da lista 2. prox -- referncia para o prximo n da lista A lista encadeia os ns, alocados em endereos de memria no consecutivos, e o campo referncia para o prximo n permite a ligao com o n seguinte, at que o ltimo n tem o valor null. O acesso aos elementos da lista feito atravs de uma referncia para o primeiro n designado por cabea. Seguindo a referncia prox, encadeamos os diferentes ns. Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 18 Dulce Mota /Helena Leit o LISTA SIMPLESMENTE LIGADA (cont) Paradigmas de Programao Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 19 Dulce Mota /Helena Leit o LISTA SIMPLESMENTE LIGADA (cont) Paradigmas de Programao Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 20 Dulce Mota /Helena Leit o Classe NO ---- usada na implementao de estruturas atravs de lista ligada Paradigmas de Programao public class No { private Object elemento; private No prox; //referncia para o n seguinte //Construtores public No() { this(null,null); } public No(Object o,No n) { elemento=o; prox=n; } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 21 Dulce Mota /Helena Leit o Classe NO ---- usada na implementao da stack atravs de lista ligada (cont) Paradigmas de Programao public void setElemento(Object novo) { elemento=novo; } public void setProx(No novo) { prox=novo; } public Object getElemento() { return elemento; } public No getProx() { return prox; } } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 22 Dulce Mota /Helena Leit o Pilha ---- implementao em Java usando lista ligada Paradigmas de Programao Nesta implementao h necessidade de considerar um atributo designado por head (cabea) que uma referncia para o n de acesso estrutura pilha. Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 23 Dulce Mota /Helena Leit o Pilha ---- implementao em Java usando lista ligada Paradigmas de Programao Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 24 Dulce Mota /Helena Leit o Pilha ---- implementao em Java usando lista ligada Paradigmas de Programao public class StackLista { private No cabeca; //referncia para o n de acesso stack private int tamanho; //n de elementos da stack //construtor public StackLista() { cabeca=null; tamanho=0; } public int size() { return tamanho; } //verifica se a stack est vazia public boolean isEmpty() { if(cabeca==null) return true; else return false; } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 25 Dulce Mota /Helena Leit o Pilha ---- implementao em Java usando lista ligada (cont) Paradigmas de Programao //junta elemento stack public void push(Object obj) { No n=new No(); n.setElemento(obj); n.setProx(cabeca); cabeca=n; tamanho++; } //retira elemento da stack public Object pop() { Object obj; if(isEmpty()) return null; else { obj=cabeca.getElemento(); cabeca=cabeca.getProx(); tamanho--; return obj; } } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 26 Dulce Mota /Helena Leit o Pilha ---- implementao em Java usando lista ligada (cont) Paradigmas de Programao //consulta o elemento de topo da stack public Object topo() { if(isEmpty()) return null; else return cabeca.getElemento(); } } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 27 Dulce Mota /Helena Leit o Fila ---- implementao em Java usando lista ligada Paradigmas de Programao Nesta implementao h necessidade de considerar dois atributos designados por front (incio) e back (fim). So referncias para os acessos aos ns nas extremidades da lista usados nas operaes de eliminao e insero. Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 28 Dulce Mota /Helena Leit o Fila ---- implementao em Java usando lista ligada Paradigmas de Programao Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 29 Dulce Mota /Helena Leit o Fila ---- implementao em Java usando lista ligada Paradigmas de Programao public class QueueLista { private No inicio; //referncia para o n incio da fila private No fim; //referncia para o n fim da fila private int tamanho; public QueueLista() { inicio = fim = null; tamanho = 0; } public int size() { return tamanho; } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 30 Dulce Mota /Helena Leit o Fila ---- implementao em Java usando lista ligada (cont) Paradigmas de Programao public boolean isEmpty() { return inicio==null; } //junta elemento no fim da queue public void enqueue(Object obj) { No n = new No(); if (isEmpty()) { inicio = fim = n; } else { fim.setProx(n); fim = n; } n.setElemento(obj); tamanho++; } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 31 Dulce Mota /Helena Leit o Fila ---- implementao em Java usando lista ligada (cont) Paradigmas de Programao //remove elemento do inicio da queue public Object dequeue() { Object obj; if (isEmpty()) { return null; } else { obj = inicio.getElemento(); inicio = inicio.getProx(); //actualiza a referncia para o fim da fila caso esta fique vazia if (inicio == null) { fim = null; } tamanho--; return obj; } } } Ano Lectivo 2009/2010 Tpicos das aulas Terico Prticas 32 Dulce Mota /Helena Leit o Paradigmas de Programao Construa uma classe de teste para cada uma das estruturas de dados estudadas usando objectos do tipo Ponto. Exerccio: