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 Tópicos das aulas Teórico Práticas 1
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...... Tópicos das aulas Teórico Práticas 2
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. Tópicos das aulas Teórico Práticas 3
PILHA --- Implementação em Java usando arrays Tópicos das aulas Teórico Práticas 4
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]; Tópicos das aulas Teórico Práticas 5
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]; Tópicos das aulas Teórico Práticas 6
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; Tópicos das aulas Teórico Práticas 7
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); Tópicos das aulas Teórico Práticas 8
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 ). Tópicos das aulas Teórico Práticas 9
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. Tópicos das aulas Teórico Práticas 10
FILA (cont) Tópicos das aulas Teórico Práticas 11
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]; Tópicos das aulas Teórico Práticas 12
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]; Tópicos das aulas Teórico Práticas 13
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; Tópicos das aulas Teórico Práticas 14
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; Tópicos das aulas Teórico Práticas 15
LISTA SIMPLESMENTE LIGADA Vimos como implementar os tipos abstractos de dados, pilha e fila, usando arrays. Vantagem desta implementação: Desvantagem Simplicidade Pouco dinâmica, é necessário fixar o número máximo de elementos que a estrutura pode comportar. Para colmatar esta desvantagem vamos usar uma implementação alternativa ----- lista simplesmente ligada Tópicos das aulas Teórico Práticas 16
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. Tópicos das aulas Teórico Práticas 17
LISTA SIMPLESMENTE LIGADA (cont) Tópicos das aulas Teórico Práticas 18
LISTA SIMPLESMENTE LIGADA (cont) Tópicos das aulas Teórico Práticas 19
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; Tópicos das aulas Teórico Práticas 20
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; Tópicos das aulas Teórico Práticas 21
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. Tópicos das aulas Teórico Práticas 22
Pilha ---- implementação em Java usando lista ligada Tópicos das aulas Teórico Práticas 23
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; Tópicos das aulas Teórico Práticas 24
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; Tópicos das aulas Teórico Práticas 25
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(); Tópicos das aulas Teórico Práticas 26
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. Tópicos das aulas Teórico Práticas 27
Fila ---- implementação em Java usando lista ligada Tópicos das aulas Teórico Práticas 28
Fila ---- implementação em Java usando lista ligada public class QueueLista { private No inicio; private No fim; private int tamanho; //referência para o nó início da fila //referência para o nó fim da fila public QueueLista() { inicio = fim = null; tamanho = 0; public int size() { return tamanho; Tópicos das aulas Teórico Práticas 29
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++; Tópicos das aulas Teórico Práticas 30
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; Tópicos das aulas Teórico Práticas 31
Exercício: Construa uma classe de teste para cada uma das estruturas de dados estudadas usando objectos do tipo Ponto. Tópicos das aulas Teórico Práticas 32