You are on page 1of 32

Ano Lectivo 2009/2010

Tpicos das aulas Terico Prticas 1


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:

You might also like