Sei sulla pagina 1di 25

Estrutura de Dados

TAD Deque

Maikol M. Rodrigues
Turmas A e B (UNIFOR)

Fila de duas Extremidades (Deque)


UmaDequesuportainseresedeleesdeambasasextremidades.
TheDequeAbstractDataType
insertFirst(e):
Inseronoinciododeque.
insertLast(e):
Inseronofinaldodeque
removeFirst():
Removeeretornaoprimeiroelemento
removeLast():
Removeeretornaoltimoelemento

Adicionamentepodeseacrescentarosseguintesmtodos:
first()

last()
size()
isEmpty()

Fila de duas Extremidades


publicinterfaceDeque{
publicintsize();
publicObjectfirst()throwsDequeEmptyException;
publicObjectlast()throwsDequeEmptyException;
publicbooleanisEmpty();
publicvoidinsertLast(Objecto);
publicvoidinsertFirst(Objecto);
publicObjectremoveLast()throwsDequeEmptyException;
publicObjectremoveFist()throwsDequeEmptyException;
}
3

Fila de duas Extremidades


publicclassDequeEmptyExceptionextends
RuntimeException{
publicDequeEmptyException(Stringerr){
super(err);
}
}

Implementando Deque com Lista


Duplamente Encadeada (LDE)

Deleodoltimoelementodeumalistasimplesmente
encadeadanopodeserfeitoemtempoconstante.
ParaimplementaroDequeutilizaremosumalistaduplamente
encadeadacomdoisnsSENTINELAS.
5

Classe DLNode
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;
}

Classe DLNode

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; }
}

Deque usando LDE


publicclassMyDequeimplementsDeque{
DLNodeheader,trailer;//sentinels
intsize;//numberofelements
publicMyDeque(){
header=newDLNode();
trailer=newDLNode();

header.setNext(trailer);//makeheaderpointtotrailer
trailer.setPrev(header);//maketrailerpointtoheader
size=0;
}

Deque usando LDE


public boolean isEmpty() { return (size==0); }
public Object first() throws
DequeEmptyException {
if (isEmpty())

throw new DequeEmptyException("Deque is


empty.");
return header.getNext().getElement(); }

public Object last() throws DequeEmptyException


{
if (isEmpty())

Deque usando LDE


public void insertFirst(Object o) {
DLNode second = header.getNext();
DLNode first = new DLNode(o, header, second);
second.setPrev(first);

header.setNext(first);
size++;
}
10

Deque usando LDE


public Object removeLast() throws
DequeEmptyException { if (isEmpty())
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;

11

Deque usando LDE (removeLast)


Aquiuma
visualizaodo
removeLast().

Exerccios de Reviso
1)
1) Implemente
Implemente um
um mtodo
mtodo para
para inverter
inverterencapsuencapsulados
lados na
na classe
classe MyDeque
MyDeque acessando
acessando diretamente
diretamente aa
Estruturas
Estruturas de
de Dados.
Dados.
2)
2) Implemente
Implemente um
um mtodo
mtodo para
para inverter
inverterencapsuencapsulados
lados na
na classe
classe MyDeque
MyDeque usando
usando as
as operaes
operaes
bsicas
bsicas do
do Deque.
Deque.

3)
3) Reimplemente
Reimplementeaa classe
classe MyDeque
MyDeque sem
sem aa
utilizao
utilizao de
de ns
ns SENTINELAS.
SENTINELAS.
13

Exerccios
1)
1) Implemente
Implemente oo mtodo
mtodo removeFirst()
removeFirst() ee
insertLast()
insertLast() encapsulados
encapsulados na
na classe
classe MyDeque.
MyDeque.
2)
2) Utilizando
Utilizando os
os mtodos
mtodos da
da classe
classe MyDeque
MyDeque
implemente
implemente aa classe
classe Pilha
Pilha ee aa classe
classe Fila.
Fila.

3)
3) Reimplemente
Reimplemente aa classe
classe MyDeque
MyDeque usando
usando uma
uma
Lista
Lista Simplesmente
Simplesmente Encadeada
Encadeada sem
sem aa utilizao
utilizao
de
de ns
ns SENTINELAS.
SENTINELAS.

14

Exerccios
4)
4) Programe
Programe as
as operaes
operaes bsicas
bsicas para
para deque,
deque,
na
na representao
representaopor
porlista
lista linear
linearsimplesmente
simplesmente
encadeada.
encadeada.

5)
5) Implemente
Implemente oo TAD-Deque
TAD-Deque usando
usando vetor
vetorde
de tal
tal
forma
forma que
queoo primeiro
primeiroelemento
elemento sempre
sempreseja
seja oo da
da
posio
posio 11 do
do vetor.
vetor.(CASA)
(CASA)
6)
6)Descreva
Descrevaem
empseudocdigo
pseudocdigoum
ummtodo
mtodopara
paraencontrar
encontrar
oonodo
nododo
domeio
meiode
deuma
umaLDE
LDEcom
comsentinelas
sentinelaseeum
umnmero
nmero
mpar
mparde
dens.
ns.No
Nouse
usecontadores.
contadores.

15

Deque usando LDE


public void insertLast(Object o) {
DLNode ant = trailer.getPrev();
DLNode last = new DLNode(o, ant, trailer);
trailer.setPrev(last);

ant.setNext(last);
size++;
}
16

RemoveFirst
public Object removeFirst() throws
DequeEmptyException {
if (isEmpty())
throw new DequeEmptyException("Deque is
empty.");
DLNode first = header.getNext();
Object o = first.getElement();
DLNode second = first.getNext();
header.setNext(second);
second.setPrev(header);
size--;
return o;

Implementao de Pilha e Fila


com Deque
StackswithDeques:

QueueswithDeques:

Implementao de Pilha com Deque


publicclassDequeStackimplementsStack{
privateMyDequeD;
publicDequeStack(){D=newMyDeque();}
publicintsize(){returnD.size();}
publicbooleanisEmpty(){
returnD.isEmpty();

}
publicvoidpush(Objectobj){
D.insertLast(obj);
}

19

Implementao de Pilha com Deque


publicObjecttop()throwsStackEmptyException{
try{returnD.last();}
catch(DequeEmptyExceptione){
thrownewStackEmptyException("Stackisempty!");}
}
publicObjectpop()throwsStackEmptyException{

try{returnD.removeLast();}
catch(DequeEmptyExceptione){
thrownewStackEmptyException("Stackisempty!");
20
}

Implementao de Pilha com Deque


publicstaticvoidmain(Stringargs[]){

DequeStackA1=newDequeStack();

Characterb=newCharacter('A');
Integerc=newInteger(9);

A1.push(newInteger(3));A1.push(b);A1.push(c);

System.out.println(A1.pop() + "\n" + A1.pop() + "\n" + A1.pop() +


"\n");
if(A1.isEmpty())System.out.println("APilhaestaVAZIA...");
if(A1.isEmpty())System.out.println("APilhaestaVAZIA...");
}
21

Exerccios
1)
1) Descreva
Descreva um
um algoritmo
algoritmo recursivo
recursivo para
para contar
contar
oo nmero
nmerode
de elementos
elementos em
em uma
uma lista
lista simplessimplesmente
mente encadeada.
encadeada. Use
Use aa classe
classe LinkedStack.
LinkedStack.

2)
2) Utilizando
Utilizando os
os mtodos
mtodos da
da classe
classe MyDeque
MyDeque
implemente
implemente aa classe
classe Fila.
Fila.
3)
3) Descreva
Descreva um
um algoritmo
algoritmo recursivo
recursivo para
para para
para
determinar
determinaroo maior
maiorelemento
elemento em
em um
um Arranjo
ArranjoAA
de
de nn elementos.
elementos. (CASA)
(CASA)

22

Exerccios
4)
4)Implemente
Implementeum
ummtodo
mtodopara
parainverter
inverterum
umDeque
Dequeutilizando
utilizando
uma
umaPilha
PilhaAuxiliar.
Auxiliar.OBS:Voc
OBS:Vocpoder
poderutilizar
utilizaras
asOB
OBde
de
Deque
DequeeePilha.
Pilha.Refaa
RefaaUsando
UsandoFila
Filaem
emvez
vezda
daPilha.
Pilha.

5)
5) Refaa
Refaa oo exerccio
exerccio anterior
anteriorusando
usando uma
uma Fila
Fila
como
como ED
ED auxiliar.
auxiliar.
6)
6)Descreva
Descrevaem
empseudocdigo
pseudocdigoum
ummtodo
mtodopara
paraencontrar
encontraroonodo
nodo
do
domeio
meiode
deuma
umaLDE
LDEcom
comsentinelas
sentinelascom
comum
umnmero
nmerompar
mparde
de
ns.
ns.No
Nouse
usecontadores.
contadores.Refaa
Refaaooexerccio
exercciopara
pararetornar
retornarnull
null
quando
23
quandooonmero
nmerode
deelementos
elementosfor
forpar.
par.

Exerccios
7)
7)Inverta
Invertauma
umaPilha
Pilhaimplementada
implementadacom
comuma
umaLista
Lista
Simplesmente
SimplesmenteEncadeada
Encadeadautilizando
utilizandoapenas
apenasreferncias.
referncias.
No
Noutilize
utilizealocao
alocaode
dememria
memriaeenem
nemED
EDadicionais.
adicionais.

8)

8)Inverta
Invertaaaordem
ordemdos
doselementos
elementosna
napilha
pilhaS.
S.
Usando
Usandoum
umDeque
Deque
b.b. Usando
Usandouma
umapilha
pilhaadicional
adicionaleealgumas
algumasvariveis
variveisadicionais
adicionais
24

Exerccios
public static int maior(int[] a, int pos, int maior) {
if (pos == a.length) return maior;
else if (a[pos] > maior) return maior(a, (pos+1), a[pos]);
else return maior(a, (pos+1), maior);
}

25

Potrebbero piacerti anche