Anda di halaman 1dari 25

Estrutura de Dados

TAD Deque

Maikol M. Rodrigues
Turmas A e B (UNIFOR)

1

Fila de duas Extremidades (Deque)
Uma Deque suporta inserções e deleções de ambas as extremidades. 
The Deque Abstract Data Type
insertFirst(e): 
Inserção no início do deque.
insertLast(e):
Inserção no final do deque
removeFirst():
Remove e retorna o primeiro elemento
removeLast(): 
Remove e retorna o último elemento
  

Adicionamente pode­se acrescentar os seguintes métodos:
first()
  
last()
size()
isEmpty()

2

Fila de duas Extremidades
public interface Deque {  
public int size();
public Object first() throws DequeEmptyException; 
public Object last() throws DequeEmptyException;
public boolean isEmpty(); 
public void insertLast(Object o); 
  public void insertFirst(Object o); 
public Object removeLast() throwsDequeEmptyException; 
  public Object removeFist() throwsDequeEmptyException; 
}
3

Fila de duas Extremidades
public class DequeEmptyException extends 
RuntimeException {  
  public DequeEmptyException(String err) {
    super(err);
  }
}
  
  
4

Implementando Deque com Lista
Duplamente Encadeada (LDE)

  

•Deleção do último elemento de uma lista simplesmente 
encadeada não pode ser feito em tempo constante.
   •Para implementar o Deque utilizaremos uma lista duplamente 
encadeada com dois nós SENTINELAS.
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;
}

6

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

7

Deque usando LDE
public class MyDeque  implements Deque {
  DLNode header, trailer;  // sentinels
  int size;    // number of elements
  public MyDeque() {
    header = new DLNode();
    trailer = new DLNode();
  
    header.setNext(trailer); // make header point to trailer
      trailer.setPrev(header); // make trailer point to header
    size = 0;
  }

8

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())

9

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)
Aqui uma 
visualização do 
removeLast().

1

Exercícios de Revisão
1)
1) Implemente
Implemente um
um método
método 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 método
método para
para inverter
inverterencapsuencapsulados
lados na
na classe
classe MyDeque
MyDeque usando
usando as
as operações
operações
básicas
básicas do
do Deque.
Deque.
  

3)
3) Reimplemente
Reimplementeaa classe
classe MyDeque
MyDeque sem
sem aa
utilização
utilização de
de nós
nós SENTINELAS.
SENTINELAS.
13

Exercícios
1)
1) Implemente
Implemente oo método
método removeFirst()
removeFirst() ee
insertLast()
insertLast() encapsulados
encapsulados na
na classe
classe MyDeque.
MyDeque.
2)
2) Utilizando
Utilizando os
os métodos
métodos 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 utilização
utilização
de
de nós
nós SENTINELAS.
SENTINELAS.

14

Exercícios
4)
4) Programe
Programe as
as operações
operações básicas
básicas para
para “deque”,
“deque”,
na
na representação
representaçãopor
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
posição
posição 11 do
do vetor.
vetor.(CASA)
(CASA)
6)
6)Descreva
Descrevaem
empseudocódigo
pseudocódigoum
ummétodo
métodopara
paraencontrar
encontrar
oonodo
nododo
domeio
meiode
deuma
umaLDE
LDEcom
comsentinelas
sentinelaseeum
umnúmero
número
ímpar
ímparde
denós.
nós.Não
Nãouse
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;

1

Implementação de Pilha e Fila
com Deque
Stacks with Deques:

Queues with Deques:

1

Implementação de Pilha com Deque
public class DequeStack implements Stack {
  private MyDeque D;
  public DequeStack() {  D = new MyDeque();  }
  public int size() {  return D.size(); }
  public boolean isEmpty() {
    return D.isEmpty();
  
  }
    public void push(Object obj) {
    D.insertLast(obj);
  }

19

Implementação de Pilha com Deque
 public Object top() throws StackEmptyException {
    try { return D.last();  }
    catch (DequeEmptyException e) {
      throw new StackEmptyException("Stack is empty!");   }
  }
  public Object pop() throws StackEmptyException {
  
    try {  return D.removeLast(); }
      catch (DequeEmptyException e) {
      throw new StackEmptyException("Stack is empty!");
20
    }

Implementação de Pilha com Deque
 public static void main(String args[]) {

  
  

}

   DequeStack A1 = new DequeStack();
  
   Character b = new Character('A');
   Integer c = new Integer(9);
  
   A1.push(new Integer(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("A Pilha esta VAZIA... "); 
   if (A1.isEmpty()) System.out.println("A Pilha esta VAZIA... "); 
  }  
21

Exercícios
1)
1) Descreva
Descreva um
um algoritmo
algoritmo recursivo
recursivo para
para contar
contar
oo número
númerode
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 métodos
métodos 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

Exercícios
4)
4)Implemente
Implementeum
ummétodo
métodopara
parainverter
inverterum
umDeque
Dequeutilizando
utilizando
uma
umaPilha
PilhaAuxiliar.
Auxiliar.OBS:Você
OBS:Vocêpoderá
poderáutilizar
utilizaras
asOB
OBde
de
Deque
DequeeePilha.
Pilha.Refaça
RefaçaUsando
UsandoFila
Filaem
emvez
vezda
daPilha.
Pilha.

  
  

5)
5) Refaça
Refaça oo exercício
exercício anterior
anteriorusando
usando uma
uma Fila
Fila
como
como ED
ED auxiliar.
auxiliar.
6)
6)Descreva
Descrevaem
empseudocódigo
pseudocódigoum
ummétodo
métodopara
paraencontrar
encontraroonodo
nodo
do
domeio
meiode
deuma
umaLDE
LDEcom
comsentinelas
sentinelascom
comum
umnúmero
númeroímpar
ímparde
de
nós.
nós.Não
Nãouse
usecontadores.
contadores.Refaça
Refaçaooexercício
exercíciopara
pararetornar
retornarnull
null
quando
23
quandooonúmero
númerode
deelementos
elementosfor
forpar.
par.

Exercícios
7)
7)Inverta
Invertauma
umaPilha
Pilhaimplementada
implementadacom
comuma
umaLista
Lista
Simplesmente
SimplesmenteEncadeada
Encadeadautilizando
utilizandoapenas
apenasreferências.
referências.
Não
Nãoutilize
utilizealocação
alocaçãode
dememória
memóriaeenem
nemED
EDadicionais.
adicionais.

   8)

8)Inverta
Invertaaaordem
ordemdos
doselementos
elementosna
napilha
pilhaS.
S.
Usando
Usandoum
umDeque
Deque
b.b. Usando
Usandouma
umapilha
pilhaadicional
adicionaleealgumas
algumasvariáveis
variáveisadicionais
adicionais
24

Exercícios
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