Você está na página 1de 37

Captulo III Pilhas e Filas

Prof. Eng. D.Sc. Emerson Cordeiro Morais

Sumrio
Pilhas Sequenciais Pilhas Encadeadas Filas Sequenciais Filas Encadeadas Filas Duplas ou Deques Sequenciais Deques Encadeadas

Prof. Eng. D.Sc. Emerson Cordeiro Morais

Pilhas e Filas
So listas especializadas por terem caractersticas prprias, mas tambm possuem operaes: inserir e excluir um elemento; encontrar o maior e o menor; contar os elementos, alterar e buscar um elemento, buscar o sucessor e o predecessor. Essas duas estruturas de dados representam conjuntos de dados que esto organizados em ordem linear. Conforme suas caractersticas, podem ser classificadas em quatro tipos: Estticas: a ordem linear determinada pelos ndices dos vetores. p Dinmicas: representadas por elementos encadeados. Homognea: contm apenas um dado primitivo, como um nmero. Heterognea: contm um dado composto, como o nome e o salrio de um funcionrio.
Prof. Eng. D.Sc. Emerson Cordeiro Morais

Pilhas e Filas
Estrutura de dados tipo pilha p p Estrutura de dados tipo fila p

Prof. Eng. D.Sc. Emerson Cordeiro Morais

Pilhas e Filas
Excluses LIFO Last In First Out Pilha o ltimo componente inserido o primeiro a ser retirado PILHA FIFO First In First Out Fila o primeiro componente inserido tambm o primeiro a ser retirado Topo Consultas Inseres

FILA

Excluses e Consultas

Incio

Final Inseres
5

Prof. Eng. D.Sc. Emerson Cordeiro Morais

Pilhas
uma lista linear em que todas as inseres, retiradas e, geralmente, todos os acessos so feitos em apenas um extremo da lista lista. Os itens so colocados um sobre o outro. O item inserido mais recentemente est no topo e o inserido menos recentemente no fundo. Esta imagem est frequentemente associada com a teoria de autmato, na qual o topo de uma pilha considerado como o receptculo de uma cabea de leitura/gravao que pode empilhar e desempilhar itens da pilha. ilh Propriedade: o ltimo item inserido o primeiro item que pode ser retirado da lista. So chamadas listas lifo (last-in, first-out).

Prof. Eng. D.Sc. Emerson Cordeiro Morais

Pilhas
Existe uma ordem linear para pilhas, do mais recente para o menos recente. Uma pilha contm uma seqncia de obrigaes adiadas. A ordem de remoo garante que as estruturas mais internas sero processadas antes das mais externas. Aplicaes em estruturas aninhadas:
Quando necessrio caminhar em um conjunto de dados e guardar uma lista de coisas a fazer posteriormente. p O controle de seqncias de chamadas de subprogramas. A sintaxe de expresses aritmticas.

As pilhas ocorrem em estruturas de natureza recursiva (como rvores). Elas so utilizadas para implementar a recursividade.
Prof. Eng. D.Sc. Emerson Cordeiro Morais

TAD Pilhas
O conjunto de operaes mais usual: inserir na pilha; consultar toda a pilha; Remover da pilha; e esvazi-la. Qualquer estrutura desse tipo possui um ponteiro denominado topo, no qual todas as operaes de insero e remoo acontecem. Assim, as operaes ocorrem sempre na mesma extremidade. Existem vrias opes de estruturas de dados que podem ser usadas para representar pilhas. As duas representaes mais utilizadas so as implementaes por meio de vetores e de apontadores.
Prof. Eng. D.Sc. Emerson Cordeiro Morais

Pilhas Sequenciais
Os itens da pilha so armazenados em posies contguas de memria. Como as inseres e as retiradas ocorrem no topo da pilha, um cursor pilha chamado Topo utilizado para controlar a posio do item no topo da pilha. Lim
Topo

ndices do arranjo

Pilha
9

Prof. Eng. D.Sc. Emerson Cordeiro Morais

Pilhas Sequenciais
1. Inicializar pilha de valores inteiros, com 10 ns; 2. 2 Inserir nodo com valor 3; 3. Inserir nodo com valor 7; 4. Inserir nodo com valor 5; e 5. Remover nodo do topo.
LIM
9 8 7 6 5 4 3 2 1 0 PILHA

LIM

9 8 7 6 5 4 3 2

LIM

9 8 7 6 5 4 3

LIM

9 8 7 6 5 4

LIM

9 8 7 6 5 4 3

TOPO

TOPO

TOPO

TOPO

1 0

7 3
PILHA

1 0

5 7 3
PILHA

2 1 0

TOPO

7 3

1 0

PILHA

PILHA

Prof. Eng. D.Sc. Emerson Cordeiro Morais

10

Classe PilhaSequencial
Conjunto de Operaes:
1. 1 PilhaSequencial() Inicializa a pilha vazia com tamanho maxtam maxtam. 2. boolean EstaVazia() Retorna true se a pilha estiver vazia ou false, caso contrrio. 3. void Insere(int dado) Insere dado no topo da pilha. 4. int Tamanho() Retorna o tamanho atual da pilha. 5. void Imprime() Imprime todos os itens da pilha. 6. void Retira() Retira o item no topo da pilha. 7. void Esvazia() Esvazia a pilha e a deixa como na inicializao. 8. public int Busca(int dado) Retorna a posio em que o item dado foi encontrado ou -1, caso no seja encontrado.

Prof. Eng. D.Sc. Emerson Cordeiro Morais

11

Classe PilhaSequencial
package cap3.pilhasequencial; public class PilhaSequencial { final int maxtam = 100; //tamanho mximo da pilha private int pilha[]; private int topo; //Operaes public PilhaSequencial () { this.pilha = new int[maxtam]; //cria uma pilha com n posies this.topo = 0; } public boolean EstaVazia () { return (this.topo == 0); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

12

Insero de Novo Item


Lim

Topo

9 8 7 6 5 4 3 2 1 0
Pilha

Operao PUSH Lim

Topo

9 8 7 6 5 4 3 2 1 0
Pilha

Prof. Eng. D.Sc. Emerson Cordeiro Morais

13

Insero de Novo Item e Tamanho


public void Insere (int dado) { if (this.topo >= this.pilha.length){ System.out.println("\nA PILHA EST CHEIA!"); } else if (this.Busca(dado)!= -1){ System.out.println("\nNMERO J EXISTENTE NA PILHA!"); } else{ this.pilha[this.topo] = dado; this.topo++; System.out.println("\nNMERO INSERIDO NA PILHA!"); } } public int Tamanho () { return this.topo; }

Prof. Eng. D.Sc. Emerson Cordeiro Morais

14

Remoo de um Item
Lim

Topo

9 8 7 6 5 4 3 2 1 0
Pilha

Operao POP

Lim

Topo

9 8 7 6 5 4 3 2 1 0
Pilha

Prof. Eng. D.Sc. Emerson Cordeiro Morais

15

Remoo de um Item e Imprime


public void Retira (){ if (this.EstaVazia ()) { y p ( p ); System.out.println ("A pilha est vazia!"); } else { this.topo = this.topo - 1; System.out.println("\n"+this.pilha[this.topo]+" RETIRADO DA PILHA!"); } // fim do else } // fim do mtodo public void Imprime () { if (this.EstaVazia()){ System.out.println ("A pilha est vazia!");} ( A vazia! );} else{ System.out.println ("Impresso da Pilha \n"); for (int i=this.topo-1; i>=0;i--){ System.out.print (this.pilha[i] + " "); } } }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

16

Esvazia e Busca de um Elemento


public void Esvazia () { if (this.EstaVazia ()) { y p ( p ); System.out.println ("A pilha est vazia!"); } else{ this.topo = 0; } } public int Busca (int dado) { if (this.EstaVazia ()) { return -1; } else{ for (int i=0; i<this.topo; i++){ if (this.pilha[i] == dado) return i; //retorna a posio do elemento encontrado } } return -1; }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

17

Pilhas Encadeadas
Cada clula de uma pilha contm um item da pilha e um apontador para outra clula.
Info Elo Topo da pilha

Base da pilha
Prof. Eng. D.Sc. Emerson Cordeiro Morais

18

Classe PilhaEncadeada
Conjunto de Operaes:
1. 1 PilhaEncadeada() Inicializa a pilha vazia vazia. 2. boolean EstaVazia() Retorna true se a pilha estiver vazia ou false, caso contrrio. 3. void Insere(int dado) Insere dado no topo da pilha. 4. int Tamanho() Retorna o tamanho atual da pilha. 5. void Imprime() Imprime todos os itens da pilha. 6. void Retira() Retira o item no topo da pilha. 7. void Esvazia() Esvazia a pilha e a deixa como na inicializao. 8. public Object Busca(int dado) Retorna o item dado quando encontrado ou null, caso no seja encontrado.

Prof. Eng. D.Sc. Emerson Cordeiro Morais

19

Classe PilhaEncadeada
package cap3.pilhaencadeada; public class PilhaEncadeada { private static class Celula { int i t num; Celula prox; } private Celula topo; private int tam; //Operaes public PilhaEncadeada () { this.topo = null; this.tam = 0; } public boolean EstaVazia () { return (this.topo == null); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

20

10

Insero de Novo Item


Topo Topo Topo Novo nodo

Prof. Eng. D.Sc. Emerson Cordeiro Morais

21

Insero de Novo Item e Tamanho


public void Insere (int dado) { if (this.Busca(dado)== null){ Celula novo = new Celula (); novo.num = dado; novo.prox = this.topo; this.topo = novo; this.tam++; System.out.println("\nNMERO INSERIDO NA PILHA!"); } else{ System.out.println("\nNMERO J EXISTENTE NA PILHA!"); } } public int Tamanho () { return this.tam; }

Prof. Eng. D.Sc. Emerson Cordeiro Morais

22

11

Remoo de um Item
Nodo a ser removido

Topo Topo

Prof. Eng. D.Sc. Emerson Cordeiro Morais

23

Remoo de um Item e Imprime


public void Retira (){ if (this.EstaVazia ()) { System.out.println ("A pilha est vazia!"); } else { System.out.println("\n"+this.topo.num+" RETIRADO DA PILHA!"); i l ("\ " thi " !") this.topo = this.topo.prox; this.tam--; } // fim do else } // fim do mtodo public void Imprime () { if (this.EstaVazia()){ System.out.println ("A pilha est vazia!"); } else{ System.out.println ("Impresso da Pilha \n"); Celula aux = this.topo; while (aux != null) { System.out.print (aux.num + " "); aux = aux.prox; } } }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

24

12

Esvazia e Busca de um Elemento


public void Esvazia () { if (this.EstaVazia ()) { System.out.println ("A pilha est vazia!"); } else{ this.topo = null; this.tam = 0; } } public Object Busca (int dado) { if (this.EstaVazia ()) { return null; } else{ Celula aux = this.topo; while (aux != null) { if (aux.num == dado) return aux.num; aux = aux.prox; } } return null; }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

25

Anlise da Complexidade
A ao de insero e remoo sempre realiza operaes bsicas para atualizar o topo da pilha So operaes de tempo constante e gastam pilha. O(1). A operao de consultar toda a pilha percorre os elementos armazenados. Uma pilha contm n elementos, logo o tempo de execuo O(n). A operao de esvaziamento da pilha remove todos os elementos. O tempo gasto depende da linguagem de programao utilizada Java utilizada. possui coleta de lixo automtica.

Prof. Eng. D.Sc. Emerson Cordeiro Morais

26

13

Filas
uma lista linear em que todas as inseres so realizadas em um extremo da lista e todas as retiradas e geralmente os acessos so lista, e, geralmente, realizados no outro extremo da lista. So chamadas listas fifo (first-in, first-out). Existe uma ordem linear para filas que a ordem de chegada. So utilizadas quando desejamos processar itens de acordo com a ordem primeiro-que-chega, primeiro-atendido. Sistemas operacionais utilizam filas para regular a ordem na qual tarefas devem receber processamento e recursos devem ser alocados a processos.

Prof. Eng. D.Sc. Emerson Cordeiro Morais

27

TAD Filas
O conjunto de operaes mais usual: inserir na fila; consultar toda a fila; remover da fila; e esvazi-la. Essa estrutura possui um ponteiro INCIO (remoes) e um FIM (inseres). As operaes ocorrem nas duas extremidades da estrutura.
Incio Final Inseres Excluses e Consultas
Prof. Eng. D.Sc. Emerson Cordeiro Morais

28

14

Filas Sequenciais
Os itens so armazenados em posies contguas de memria. A operao Enfileira ou Insere faz a parte de trs da fila expandir se expandir-se. A operao Desenfileira ou Retira faz a parte da frente da fila contrairse. A fila tende a caminhar pela memria do computador, ocupando espao na parte de trs e descartando espao na parte da frente. Com poucas inseres e retiradas, a fila vai ao encontro do limite do espao da memria alocado para ela. Soluo: imaginar o vetor como um crculo. A primeira posio segue a ltima.

Prof. Eng. D.Sc. Emerson Cordeiro Morais

29

Filas Sequenciais
A fila se encontra em posies contguas de memria, em alguma posio do crculo delimitada pelos apontadores Incio (ou Frente) e crculo, Fim (ou Trs). Para enfileirar, basta mover o apontador Fim uma posio no sentido horrio. Para desenfileirar, basta mover o apontador Incio uma posio no sentido horrio.

Prof. Eng. D.Sc. Emerson Cordeiro Morais

30

15

Filas Sequenciais
Problemas na implementao circular de filas: Nos casos de fila cheia e fila vazia os apontadores Frente e Trs vazia, apontam para a mesma posio do crculo. Uma sada para distinguir as duas situaes deixar uma posio vazia no vetor. Nesse caso, a fila est cheia quando Trs+1 for igual a Frente. A implementao utiliza aritmtica modular nos procedimentos Insere e Retira (% do Java).

Prof. Eng. D.Sc. Emerson Cordeiro Morais

31

Filas Sequenciais
IF=FF 0 1 2 3 4 5

Evoluo da Fila

FILA IF 0 FF 1 2 3 4 5

1. 2. 3. 4. 5.

Inicializar a fila Inserir um novo nodo com valor 3 Inserir um novo nodo com valor 7 Inserir um novo nodo com valor 5 Remover um nodo

FILA

3
IF 0 1 FF 2 3 4 5

FILA

3
IF 0

7
1 2 FF 3 4 5

FILA

3
0

7
IF 1

5
2 FF 3 4 5

FILA
Prof. Eng. D.Sc. Emerson Cordeiro Morais

5
32

16

Filas Sequenciais
IF
0 1 2 3 4 5 6

FF
7 8 9 10 11 12

FILA IF
0 1 2 3 4 5 6 7 8

FF
9 10 11 12

FILA IF
0 1 2 3 4 5 6 7 8 9 10 11

FF
12

FILA FF
0 1 2 3 4

IF
5 6 7 8 9 10 11 12

FILA FF
0 1 2 3 4

IF
5 6 7 8 9 10 11 12
33

FILA CHEIA
Prof. Eng. D.Sc. Emerson Cordeiro Morais

Classe FilaSequencial
Conjunto de Operaes:
1. 1 FilaSequencial() Inicializa a fila vazia com tamanho maxtam maxtam. 2. boolean EstaVazia() Retorna true se a fila estiver vazia ou false, caso contrrio. 3. void Insere(int dado) Insere dado no final da fila. 4. int Tamanho() Retorna o tamanho atual da fila. 5. void Imprime() Imprime todos os itens da fila. 6. void Retira() Retira o item no incio da fila. 7. void Esvazia() Esvazia a fila e a deixa como na inicializao. 8. public int Busca(int dado) Retorna a posio em que o item dado foi encontrado ou -1, caso no seja encontrado.

Prof. Eng. D.Sc. Emerson Cordeiro Morais

34

17

Classe FilaSequencial
package cap3.filasequencial; public class FilaSequencial { ; // g p p final int maxtam = 100; //tamanho igual a maxtam-1 para resolver o problema circular private int fila[]; private int inicio,fim; private int tam; //Operaes public FilaSequencial () { this.fila = new int[maxtam]; //cria uma fila com n posies this.inicio = 0; this.fim = this.inicio; this.tam = 0; } public boolean EstaVazia () { return (this.inicio == this.fim); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

35

Insero de Novo Item


Nodo inserido sempre no final da fila
Testar se tem espao livre para inserir:

... ... ...

IF

FF

... ...

atrs

FF IF

na frente

FF

IF

...

no meio

Prof. Eng. D.Sc. Emerson Cordeiro Morais

36

18

Insero de Novo Item e Tamanho


public void Insere (int dado) { if (this.fim + 1 % this.fila.length == this.inicio){ System.out.println("\nA FILA EST CHEIA!"); } else if (this.Busca(dado)!= -1){ System.out.println("\nNMERO J EXISTENTE NA FILA!"); } else{ this.fila[this.fim] = dado; this.fim = (this.fim + 1)% this.fila.length; this.tam++; System.out.println("\nNMERO INSERIDO NA FILA!"); } } public int Tamanho () { return this.tam; }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

37

Remoo de um Item
Nodo removido sempre o do incio da fila
Nodo que pode ser removido

IF
0 1 2 3 4 5 6 7 8 9 10

FF
11 12

FILA

IF
0 1 2 3 4 5 6 7 8 9 10

FF
11 12

FILA

Prof. Eng. D.Sc. Emerson Cordeiro Morais

38

19

Remoo de um Item e Imprime


public void Retira (){ if (this.EstaVazia ()) { System.out.println ("A fila est vazia!"); } else { System.out.println("\n"+this.fila[this.inicio]+" RETIRADO DA FILA!"); this.inicio = (this.inicio + 1)% this.fila.length; this.tam--; } // fim do else } // fim do mtodo public void Imprime () { if (this.EstaVazia()){ System.out.println ("A fila est vazia!"); } else{ l { System.out.println ("Impresso da Fila \n"); for (int i = this.inicio; i != this.fim; i = (i + 1) % this.fila.length){ System.out.print (this.fila[i] + " "); } } }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

39

Esvazia e Busca de um Elemento


public void Esvazia () { if (this.EstaVazia ()) { System.out.println ("A fila est vazia!"); } else{ this.inicio = 0; this.fim = this.inicio; } } public int Busca (int dado) { if (this.EstaVazia ()) { return -1; } else{ for (int i = this.inicio; i != this.fim; i = (i + 1) % this.fila.length){ if (this.fila[i] == dado) return i; //retorna a posio do elemento encontrado } } return -1; }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

40

20

Filas Encadeadas
Cada clula de uma fila contm um item da fila e um apontador para outra clula. clula

Endereo do primeiro da fila, para remoo

Endereo do final da fila, para insero

Info F1 F2

Elo F3 Fn

Para acessar o ltimo nodo, necessrio percorrer toda a fila a partir do primeiro nodo

Prof. Eng. D.Sc. Emerson Cordeiro Morais

41

Classe FilaEncadeada
Conjunto de Operaes:
1. 1 FilaEncadeada() Inicializa a fila vazia vazia. 2. boolean EstaVazia() Retorna true se a fila estiver vazia ou false, caso contrrio. 3. void Insere(int dado) Insere dado no final da fila. 4. int Tamanho() Retorna o tamanho atual da fila. 5. void Imprime() Imprime todos os itens da fila. 6. void Retira() Retira o item no incio da fila. 7. void Esvazia() Esvazia a fila e a deixa como na inicializao. 8. public Object Busca(int dado) Retorna o item dado quando encontrado ou null, caso no seja encontrado.

Prof. Eng. D.Sc. Emerson Cordeiro Morais

42

21

Classe FilaEncadeada
package cap3.filaencadeada; public class FilaEncadeada { private static class Celula { int i t num; Celula prox; } private Celula inicio,fim; private int tam; //Operaes public FilaEncadeada () { this.inicio = null; this.fim = this.inicio; this.tam = 0; } public boolean EstaVazia () { return (this.inicio == null); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

43

Insero de Novo Item


Final Final Topo Novo nodo

Incio

Incio

Prof. Eng. D.Sc. Emerson Cordeiro Morais

44

22

Insero de Novo Item


public void Insere (int dado) { if (this.Busca(dado)== null){ Celula novo = new Celula (); novo.num = dado; novo.prox = null; this.tam++; if (this.EstaVazia()){ // O nmero a ser inserido ser o primeiro e ltimo this.inicio = novo; this.fim = this.inicio; } else{ this.fim.prox this fim pro = no o novo; this.fim = novo; } System.out.println("\nNMERO INSERIDO NA FILA!"); } else{ System.out.println("\nNMERO J EXISTENTE NA FILA!"); } } 45

Prof. Eng. D.Sc. Emerson Cordeiro Morais

Remoo de um Item
Final Final

Incio Incio Novo a ser Removido


Prof. Eng. D.Sc. Emerson Cordeiro Morais

46

23

Remoo de um Item
public void Retira (){ if (this.EstaVazia ()) { System.out.println ("A fila est vazia!"); } else { // A fila contm elementos e o primeiro elemento inserido ser removido System.out.println("\n"+this.inicio.num+" RETIRADO DA FILA!"); this.inicio = this.inicio.prox; this.tam--; } // fim do else } // fim do mtodo

Prof. Eng. D.Sc. Emerson Cordeiro Morais

47

Imprime e Tamanho
public void Imprime () { if (this.EstaVazia()){ System.out.println ( A System out println ("A fila est vazia!"); vazia! ); } else{ System.out.println ("Impresso da Fila \n"); Celula aux = this.inicio; while (aux != null) { System.out.print (aux.num + " "); aux = aux.prox; } } } public int Tamanho () { return this.tam; }

Prof. Eng. D.Sc. Emerson Cordeiro Morais

48

24

Esvazia e Busca de um Elemento


public void Esvazia () { if (this.EstaVazia ()) { System.out.println ("A fila est vazia!");} else{ this.inicio = null; this.tam = 0; } } public Object Busca (int dado) { if (this.EstaVazia ()) { return null; } else{ Celula aux = this.inicio; while (aux != null) { if (aux.num == dado) return aux.num; aux = aux.prox; } } return null; }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

49

Anlise da Complexidade
A insero na fila sempre realiza operaes bsicas, para atualizar o FIM da fila O mesmo ocorre no caso da remoo para atualizar o fila. INCIO. So operaes de tempo constante e gastam tempo O(1). A operao de consultar toda a fila percorre todos os elementos armazenados. Uma fila contm n elementos, logo o tempo de execuo ser O(n). A operao de esvaziamento da fila consiste em remover todos os seus elementos. elementos O tempo gasto depende da linguagem de programao utilizada. Java possui coleta de lixo automtica..

Prof. Eng. D.Sc. Emerson Cordeiro Morais

50

25

Filas Duplas ou Deques


A estrutura de dados que chamamos de fila dupla (ou deque) consiste em uma fila na qual possvel inserir novos elementos nas duas q p extremidades, no incio e no fim. Consequentemente, permite-se tambm retirar elementos dos dois extremos. como se, dentro de uma estrutura de fila, tivssemos duas filas, com os elementos dispostos em ordem inversa uma da outra.
inseres excluses excluses inseres

Prof. Eng. D.Sc. Emerson Cordeiro Morais

51

TAD Deque
O conjunto de operaes mais usual: inserir no incio da deque; inserir no final da deque; Final Incio consultar toda a deque; Consultas Consultas remover no incio da deque; remover no final da deque; e esvazi-la. Essa estrutura possui um ponteiro INCIO (inseres e remoes) e um FIM (inseres e remoes). Ambas as operaes ocorrem nas duas extremidades da estrutura.

Prof. Eng. D.Sc. Emerson Cordeiro Morais

52

26

Deques Sequenciais
Os itens so armazenados em posies contguas de memria. As operaes insere no incio ou no fim faz a deque expandir-se. p q p As operaes retira no incio ou no fim faz a deque contrair-se. A deque tende a caminhar pela memria do computador, ocupando espao na parte de trs e descartando espao na parte da frente. Com poucas inseres e retiradas, a deque vai ao encontro do limite do espao da memria alocado para ela. Deve-se adotar a mesmo soluo d fil D d t l das filas, i t i l isto , implementar uma t deque circular.
ID
0 1 2 3 4 5 6

FD
7 8 9 10 11 12

Deque
Prof. Eng. D.Sc. Emerson Cordeiro Morais

53

Classe DequeSequencial
Conjunto de Operaes:
1. 1 DequeSequencial() Inicializa a deque vazia com tamanho maxtam maxtam. 2. boolean EstaVazia() Retorna true se a deque estiver vazia ou false, caso contrrio. 3. void InsereInicio(int dado) Insere dado no inicio da deque. 4. void InsereFinal(int dado) Insere dado no final da deque. 5. int Tamanho() Retorna o tamanho atual da deque. 6. void Imprime() Imprime todos os itens da deque. 7. void RetiraInicio() Retira o item no incio da deque. 8. void RetiraFinal() Retira o item no final da deque. 9. void Esvazia() Esvazia a deque e a deixa como na inicializao. 10. public int Busca(int dado) Retorna a posio em que o item dado foi encontrado ou -1, caso no seja encontrado.
Prof. Eng. D.Sc. Emerson Cordeiro Morais

54

27

Classe DequeSequencial
package cap3.dequesequencial; public class DequeSequencial { final int maxtam = 100; //tamanho igual a maxtam-1 para resolver o problema circular private int deque[]; private int inicio,fim; private int tam; //Operaes public DequeSequencial () { this.deque = new int[maxtam]; //cria uma deque com n posies this.inicio = 0; this.fim = this.inicio; this.tam = 0; } public boolean EstaVazia () { return (this.inicio == this.fim); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

55

Insero de Novo Item no Incio


ID
0 1 2 3 4 5 6 7 8

FD
9 10 11 12

DEQUE ID
0 1 2 3 4 5 6 7 8

FD
9 10 11 12

DEQUE Ocupao circular do arranjo: ID


0 1 2 3 4 5 6 7

FD
8 9 10 11 12

DEQUE FD
0 1 2 3 4 5 6 7 8 9 10 11

ID
12

DEQUE
Prof. Eng. D.Sc. Emerson Cordeiro Morais

56

28

Insero de Novo Item no Incio


public void InsereInicio (int dado) { if (this.fim + 1 % this.deque.length == this.inicio){ System.out.println("\nA DEQUE EST CHEIA!"); } else if (this.Busca(dado)!= -1){ System.out.println("\nNMERO J EXISTENTE NA DEQUE!"); } else{ this.inicio = (this.inicio - 1 + this.deque.length)% this.deque.length; this.deque[this.inicio] = dado; this.tam++; System.out.println("\nNMERO INSERIDO NA DEQUE!"); } }

Prof. Eng. D.Sc. Emerson Cordeiro Morais

57

Insero de Novo Item no Final


public void InsereFinal (int dado) { // mesmo insere da fila if (this.fim + 1 % this.deque.length == this.inicio){ System.out.println("\nA DEQUE EST CHEIA!"); } else if (this.Busca(dado)!= -1){ System.out.println("\nNMERO J EXISTENTE NA DEQUE!"); } else{ this.deque[this.fim] = dado; this.fim = (this.fim + 1)% this.deque.length; this.tam++; System.out.println("\nNMERO INSERIDO NA DEQUE!"); } }

Prof. Eng. D.Sc. Emerson Cordeiro Morais

58

29

Remoo de um Item no Final


ID
0 1 2 3 4 5 6

FD
7 8 9 10 11 12

DEQUE ID
0 1 2 3 4 5 6 7

FD
8 9 10 11 12

DEQUE Ocupao circular do arranjo: FD


0 1 2 3 4 5 6 7

ID
8 9 10 11 12

DEQUE FD
0 1 2 3 4 5 6 7

ID
8 9 10 11 12

DEQUE
Prof. Eng. D.Sc. Emerson Cordeiro Morais

59

Remoo no Final e no Incio


public void RetiraFinal (){ if (this.EstaVazia ()) { System.out.println ("A deque est vazia!");} else { this.fim = (this.fim - 1 + this.deque.length)% this.deque.length; System.out.println("\n"+this.deque[this.fim]+" RETIRADO DA DEQUE!"); this.tam--; } // fim do else } // fim do mtodo public void RetiraInicio (){ // mesmo retira da fila if (this.EstaVazia ()) { System.out.println ("A deque est vazia!");} else { System.out.println("\n"+this.deque[this.inicio]+" RETIRADO DA DEQUE!"); this.inicio = (this.inicio + 1)% this.deque.length; this.tam--; } // fim do else } // fim do mtodo

Prof. Eng. D.Sc. Emerson Cordeiro Morais

60

30

Imprime e Tamanho
public void Imprime () { if (this.EstaVazia()){ System.out.println ("A deque est vazia!"); } else{ System.out.println ("Impresso da Deque \n"); for (int i = this.inicio; i != this.fim; i = (i + 1) % this.deque.length){ System.out.print (this.deque[i] + " "); } } } public int Tamanho () { return this.tam; }

Prof. Eng. D.Sc. Emerson Cordeiro Morais

61

Esvazia e Busca de um Elemento


public void Esvazia () { if (this.EstaVazia ()) { System.out.println ("A deque est vazia!"); } else{ this.inicio = 0; this.fim = this.inicio; } } public int Busca (int dado) { if (this.EstaVazia ()) { return -1; } else{ for (int i = this.inicio; i != this.fim; i = (i + 1) % this.deque.length){ if (this.deque[i] == dado) return i; //retorna a posio do elemento encontrado } } return -1; }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

62

31

Deques Encadeados
Cada clula de uma deque contm um item da deque e um apontador para outra clula. clula

Endereo do incio da deque, para insero e remoo

Endereo do final da deque, para insero e remoo

Info D1 D2

Elo D3 Dn

Para acessar o ltimo nodo, necessrio percorrer toda a deque a partir do primeiro nodo
Prof. Eng. D.Sc. Emerson Cordeiro Morais

63

Classe DequeEncadeado
Conjunto de Operaes:
1. 1 DequeEncadeada() Inicializa a deque vazia vazia. 2. boolean EstaVazia() Retorna true se a deque estiver vazia ou false, caso contrrio. 3. void InsereInicio(int dado) Insere dado no inicio da deque. 4. void InsereFinal(int dado) Insere dado no final da deque. 5. int Tamanho() Retorna o tamanho atual da deque. 6. void Imprime() Imprime todos os itens da deque. 7. void RetiraInicio() Retira o item no incio da deque. 8. void RetiraFinal() Retira o item no final da deque. 9. void Esvazia() Esvazia a deque e a deixa como na inicializao. 10. public Object Busca(int dado) Retorna o item dado quando encontrado ou null, caso no seja encontrado.
Prof. Eng. D.Sc. Emerson Cordeiro Morais

64

32

Classe DequeEncadeado
package cap3.dequeencadeada; public class DequeEncadeada { private static class Celula { int num; Celula prox; } private Celula inicio,fim; private int tam; //Operaes public DequeEncadeada () { this.inicio = null; this.fim = this.inicio; this.tam = 0; } public boolean EstaVazia () { return (this.inicio == null); } //Outras Operaes }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

65

Insero de Novo Item no Incio


Final Fi l Final

Incio Incio Novo nodo

Prof. Eng. D.Sc. Emerson Cordeiro Morais

66

33

Insero de Novo Item no Incio


public void InsereInicio (int dado) { if (this.Busca(dado)== null){ Celula novo = new Celula (); novo.num = dado; this.tam++; if (this.EstaVazia()){ this.inicio = novo; this.fim = this.inicio; this.inicio.prox = null; } else{ Celula aux = this.inicio; this.inicio = novo; this.inicio.prox = aux; } System.out.println("\nNMERO INSERIDO NO INCIO DA DEQUE!"); } else{ System.out.println("\nNMERO J EXISTENTE NA DEQUE!"); } }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

67

Insero de Novo Item no Final


public void InsereFinal (int dado) { if (this.Busca(dado)== null){ Celula novo = new Celula (); novo.num = dado; novo.prox = null; this.tam++; if (this.EstaVazia()){ this.inicio = novo; this.fim = this.inicio; } else{ this.fim.prox this fim pro = no o novo; this.fim = novo; } System.out.println("\nNMERO INSERIDO NO FINAL DA DEQUE!"); } else{ System.out.println("\nNMERO J EXISTENTE NA DEQUE!"); } } 68

Prof. Eng. D.Sc. Emerson Cordeiro Morais

34

Remoo de um Item no Final


Novo a ser Removido Final

Final

Incio

Incio
Prof. Eng. D.Sc. Emerson Cordeiro Morais

69

Remoo de um Item no Final


public void RetiraFinal (){ if (this.EstaVazia ()) { System.out.println ("A deque est vazia!"); } else { System.out.println("\n"+this.fim.num+" RETIRADO DA DEQUE!"); Celula aux = this.inicio; Celula anterior = null; while (aux != this.fim){ anterior = aux; aux = aux.prox; } // fim do while this.fim = anterior; this.fim.prox = null; this.tam--; } // fim do else } // fim do mtodo

Prof. Eng. D.Sc. Emerson Cordeiro Morais

70

35

Remoo de um Item no Incio


public void RetiraInicio (){ if (this.EstaVazia ()) { System.out.println ("A deque est vazia!"); } else { System.out.println("\n"+this.inicio.num+" RETIRADO DA DEQUE!"); this.inicio = this.inicio.prox; this.tam--; } // fim do else } // fim do mtodo

Prof. Eng. D.Sc. Emerson Cordeiro Morais

71

Imprime e Tamanho
public void Imprime () { if (this.EstaVazia()){ System.out.println ("A deque est vazia!"); } else{ System.out.println ("Impresso da Deque \n"); Celula aux = this.inicio; while (aux != null) { System.out.print (aux.num + " "); aux = aux.prox; } } } public int Tamanho () { return this.tam; }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

72

36

Esvazia e Busca de um Elemento


public void Esvazia () { if (this.EstaVazia ()) { System.out.println ("A deque est vazia!"); } else{ this.inicio = null; this.tam = 0; } } public Object Busca (int dado) { if (this.EstaVazia ()) { return null; } else{ Celula aux = this.inicio; while (aux != null) { if (aux.num == dado) return aux.num; aux = aux.prox; } } return null; }
Prof. Eng. D.Sc. Emerson Cordeiro Morais

73

37