Paradigmas de Programação - Dei-Isep

Propaganda
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
Download