Paradigmas de Programação Tipos Abstractos de Dados (ADT) Estruturas construídas para armazenar determinados tipos de dados e que especificam operações que permitem a manipulação desses dados. Estudaremos duas das mais simples que se encontram entre as estruturas mais importantes: Pilha (stack) Fila (queue) Veremos a definição destas ADTs de uma forma geral e daremos duas alternativas para implementação : Array e Lista Ligada Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 1 Paradigmas de Programação PILHA (STACK): Contentor de objectos em que o processo de inserção e remoção de elementos é feito de acordo com o princípio “last-infirst-out” (LIFO) Em qualquer ocasião pode ser inserido um novo objecto e será colocado na estrutura de modo que quando for necessário retirar um elemento, sairá o último que foi inserido. (Analogia: pilha de pratos) Aplicações: •Armazenamento dos endereços visitados num navegador web •Mecanismo “undo” dos editores de texto •Recursividade .... .... Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 2 Paradigmas de Programação PILHA (STACK): Operações : 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 número de objectos na pilha Nota: a pilha só tem um acesso, quer para remover objectos quer para inserir objectos. Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 3 Paradigmas de Programação PILHA Ano Lectivo 2009/2010 --- Implementação em Java usando arrays Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 4 Paradigmas de Programação PILHA --- Implementação em Java usando arrays public class StackArray { private static final int CAPACIDADE=1000; //dimensão do array por omissão 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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 5 Paradigmas de Programação 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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 6 Paradigmas de Programação 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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 7 Paradigmas de Programação O método push() lança a excepção FullException (quando o array de implementação da stack ultrapassa a capacidade máxima) Exception Como a classe da excepção é subclasse de Exception, sempre que utilizarmos o métodos push() teremos que o fazer dentro de um bloco try...catch Código da classe FullException: FullException public class FullException extends Exception { public FullException(String erro) { super(erro); } } Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 8 Paradigmas de Programação FILA (QUEUE): Contentor de objectos em que o processo de inserção e remoção de elementos é feito de acordo com o princípio “first-infirst-out” (FIFO) Em qualquer ocasião pode ser inserido um novo objecto e será colocado na estrutura (fim da fila) de modo que quando for necessário retirar um elemento, sairá o primeiro que foi inserido, que se encontra no início da fila. (Analogia: fila para entrada no autocarro) Aplicações: • Processamento de informação em que a ordem obedeça ao princípio FIFO (Simulações…). Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 9 Paradigmas de Programação FILA (cont) Operações : enqueue(obj) - Inserir objecto obj no fim da fila dequeue() - Remover objecto do início da fila front() - Consultar objecto do início da fila (sem o remover) isEmpty() - Verificar se a fila está vazia size() - Devolve o número de objectos na fila Nota: a fila tem dois acessos ,início para remover objectos e fim para inserir objectos. Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 10 Paradigmas de Programação FILA (cont) Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 11 Paradigmas de Programação FILA ----- implementação em Java usando arrays 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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 12 Paradigmas de Programação FILA ----- implementação em Java usando arrays 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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 13 Paradigmas de Programação FILA ----- implementação em Java usando arrays //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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 14 Paradigmas de Programação FILA ----- implementação em Java usando arrays //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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 15 Paradigmas de Programação LISTA SIMPLESMENTE LIGADA Vimos como implementar os tipos abstractos de dados, pilha e fila, usando arrays. Vantagem desta implementação: Simplicidade Desvantagem Pouco dinâmica, é necessário fixar o número máximo de elementos que a estrutura pode comportar. Para colmatar esta desvantagem vamos usar implementação alternativa ----- lista simplesmente ligada Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão uma 16 Paradigmas de Programação LISTA SIMPLESMENTE LIGADA Lista simplesmente ligada é uma colecção de nós . Cada nó é um objecto composto por dois campos 1. elemento -- conteúdo da lista 2. prox -- referência para o próximo nó da lista A lista encadeia os nós, alocados em endereços de memória não consecutivos, e o campo referência para o próximo nó permite a ligação com o nó seguinte, até que o último nó tem o valor null. O acesso aos elementos da lista é feito através de uma referência para o primeiro nó designado por cabeça. Seguindo a referência prox, encadeamos os diferentes nós. Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 17 Paradigmas de Programação LISTA SIMPLESMENTE LIGADA (cont) Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 18 Paradigmas de Programação LISTA SIMPLESMENTE LIGADA (cont) Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 19 Paradigmas de Programação Classe NO ---- usada na implementação de estruturas através de lista ligada public class No { private Object elemento; private No prox; //referência para o nó seguinte //Construtores public No() { this(null,null); } public No(Object o,No n) { elemento=o; prox=n; } Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 20 Paradigmas de Programação Classe NO ---- usada na implementação da stack através de lista ligada (cont) 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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 21 Paradigmas de Programação Pilha ---- implementação em Java usando lista ligada Nesta implementação há necessidade de considerar um atributo designado por head (cabeça) que é uma referência para o nó de acesso à estrutura pilha. Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 22 Paradigmas de Programação Pilha ---- implementação em Java usando Ano Lectivo 2009/2010 lista ligada Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 23 Paradigmas de Programação Pilha ---- implementação em Java usando lista ligada public class StackLista { private No cabeca; //referência 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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 24 Paradigmas de Programação Pilha ---- implementação em Java usando lista ligada (cont) //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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 25 Paradigmas de Programação Pilha ---- implementação em Java usando lista ligada (cont) //consulta o elemento de topo da stack public Object topo() { if(isEmpty()) return null; else return cabeca.getElemento(); } } Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 26 Paradigmas de Programação Fila ---- implementação em Java usando lista ligada Nesta implementação há necessidade de considerar dois atributos designados por front (início) e back (fim). São referências para os acessos aos nós nas extremidades da lista usados nas operações de eliminação e inserção. Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 27 Paradigmas de Programação Fila ---- implementação em Java usando lista ligada Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 28 Paradigmas de Programação Fila ---- implementação em Java usando lista ligada public class QueueLista { private No inicio; //referência para o nó início da fila private No fim; //referência 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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 29 Paradigmas de Programação Fila ---- implementação em Java usando lista ligada (cont) 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 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 30 Paradigmas de Programação Fila ---- implementação em Java usando lista ligada (cont) //remove elemento do inicio da queue public Object dequeue() { Object obj; if (isEmpty()) { return null; } else { obj = inicio.getElemento(); inicio = inicio.getProx(); //actualiza a referência para o fim da fila caso esta fique vazia if (inicio == null) { fim = null; } tamanho--; return obj; } } } Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 31 Paradigmas de Programação Exercício: Construa uma classe de teste para cada uma das estruturas de dados estudadas usando objectos do tipo Ponto. Ano Lectivo 2009/2010 Tópicos das aulas Teórico Práticas Dulce Mota /Helena Leitão 32