TAD Deque
ATAI
1
ADT Deque


Uma extensão da estrutura de dados fila que suporta inserções
e remoções no início e no final da fila é chamada de fila de duas
cabeças (double-ended queue ou deque)
O ADT deque D suporta os seguintes métodos fundamentais:
 inserePrimeiro(e): Insere um novo elemento e no início de D
Entrada: Objecto; Saída: Nenhuma

insereUltimo(e): Insere um novo elemento e no final de D
Entrada: Objecto; Saída: Nenhuma

removePrimeiro(): Remove e retorna o primeiro elemento de D
Entrada: Nenhuma; Saída: Objecto

removeUltimo(): Remove e retorna o último elemento de D
Entrada: Nenhuma; Saída: Objecto
2
ADT Deque
Adicionalmente temos os seguintes métodos de suporte:
 primeiro(): Retorna o primeiro elemento de D
Entrada: Nenhuma; Saída: Objecto

ultimo(): Retorna o último elemento de D
Entrada: Nenhuma; Saída: Objecto

tamanho(): Retorna o número de elementos de D
Entrada: Nenhuma; Saída: Inteiro

estaVazia(): Determina se D está vazia
Entrada: Nenhuma; Saída: Booleano
3
Exemplo de execução numa deque
Operação
Saída
D
inserePrimeiro(3)
-
(3)
inserePrimeiro(5)
-
(5,3)
removePrimeiro( )
5
(3)
insereUltimo(7)
-
(3,7)
removePrimeiro( )
3
(7)
removeUltimo( )
7
()
removePrimeiro( )
"erro"
()
estaVazia( )
verdade
()
inserePrimeiro(9)
-
(9)
insereUltimo(7)
-
(9,7)
tamanho( )
2
(9,7)
inserePrimeiro(3)
-
(3,9,7)
insereUltimo(5)
-
(3,9,7,5)
removeUltimo( )
5
(3,9,7)
4
Interface Deque
public interface Deque {
int tamanho();
boolean estaVazia();
void inserePrimeiro(Object novo) throws DequeCheioException;
void insereUltimo(Object novo) throws DequeCheioException;
Object removeUltimo() throws DequeVazioException;
Object removePrimeiro() throws DequeVazioException;
Object ultimo() throws DequeVazioException;
Object primeiro() throws DequeVazioException;
}
5
Lista duplamente ligada
class DLNode {
private Object element;
private DLNode next, prev;
DLNode() { this(null, null, null); }
DLNode(Object e, DLNode p, DLNode n) {
element = e;
next = n;
prev = p;
}
void setElement(Object newElem) { element = newElem; }
void setNext(DLNode newNext) { next = newNext; }
void setPrev(DLNode newPrev) { prev = newPrev; }
Object getElement() { return element; }
DLNode getNext() { return next; }
DLNode getPrev() { return prev; }
}
6
Implementação do Deque com lista dupla
public class MyDeque implements Deque {
DLNode header, trailer;
int size;
// sentinels
// number of elements
public MyDeque() { // initialize an empty deque
header = new DLNode();
trailer = new DLNode();
header.setNext(trailer); // make header point to trailer
trailer.setPrev(header); // make trailer point to header
size = 0;
}
7
Método removeUltimo()
public Object removeUltimo() throws DequeEmptyException {
if (estaVazia())
throw new DequeEmptyException("Deque is empty.");
DLNode last = trailer.getPrev();
Object o = last.getElement();
DLNode secondtolast = last.getPrev();
trailer.setPrev(secondtolast);
secondtolast.setNext(trailer);
size--;
return o;
}
8
Método inserePrimeiro()
public void inserePrimeiro (Object o) {
DLNode second = header.getNext();
DLNode first = new DLNode(o, header, second);
second.setPrev(first);
header.setNext(first);
size++;
}
9
Implementação de Pilha com Deque - 1

A tabela a seguir
mapeia os métodos do
ADT pilha para os
métodos da deque:
Método da Pilha
Implementação da
Deque
tamanho( )
tamanho( )
estaVazia ( )
estaVazia ( )
topo( )
ultimo( )
empilha(e)
insereUltimo(e)
desempilha( )
removeUltimo( )
10
Implementação de Pilha com Deque - 2

A tabela a seguir
mapeia os métodos do
ADT pilha para os
métodos da deque:
Método da Pilha
Implementação da
Deque
tamanho( )
tamanho( )
estaVazia ( )
estaVazia ( )
topo( )
primeiro( )
empilha(e)
inserePrimeiro(e)
desempilha( )
removePrimeiro( )
11
Implementação de Fila com Deque

A tabela a seguir
mapeia os métodos do
ADT fila para os
métodos da deque:
Método da Fila
Implementação da
Deque
tamanho( )
tamanho( )
estaVazia ( )
estaVazia ( )
inicio( )
primeiro( )
insere(e)
insereUltimo(e)
remove( )
removePrimeiro( )
12
Implementação de Pilha com Deque
public class DequeStack implements Pilha {
private Deque d;
public DequeStack() {
d = new ImplemDeque();
}
public int tamanho() {
return d.tamanho();
}
public boolean estaVazia() {
return d.estaVazia();
}
public void empilha (Object obj) {
d.insereUltimo(obj);
}
13
Implementação de Pilha com Deque
public Object topo() throws PilhaVaziaException {
try {
return d.ultimo();
}
catch (DequeEmptyException ece) {
throw new PilhaVaziaException (“Pilha esta vazia!");
}
}
public Object desempilha() throws PilhaVaziaException {
try {
return d.removeUltimo();
}
catch (DequeEmptyException ece) {
throw new PilhaVaziaException (" Pilha esta vazia!");
}
}
}
14
Padrão Adapter
Interface Pilha
Classe DequeStack
Classe Deque
15
Padrão Abstract Factory
16
Padrão Abstract Factory
- CriarFila
- CriarPilha
Pilha
Implem.
Estatica
PilhaArray
Implem.
Dinamica
PilhaDin
Fila
FilaArray
FilaDin
17
Padrão Abstract Factory
- CriarFila
- CriarPilha
Pilha
Implem.
Estatica
PilhaArray
Implem.
Dinamica
PilhaDin
Fila
FilaArray
FilaDin
18
Download

Deque