90
Estruturas de Dados 1 Pilhas e filas Estudo de listas lineares especiais, com disciplina restrita de organização e de acesso a seus nodos

Pilhas e Filas

Embed Size (px)

DESCRIPTION

Pilhas e Filas Programação C/c++ C c++

Citation preview

Page 1: Pilhas e Filas

Estruturas de Dados 1

Pilhas e filas

Estudo de listas lineares especiais, com disciplina restrita

de organização e de acesso a seus nodos

Page 2: Pilhas e Filas

Estruturas de Dados 2

Pilhas e filas

Disciplina restrita

acesso permitido somente em alguns

nodos

Com disciplina restrita de organização e

acesso a seus nodos

Listas lineares especiais

Page 3: Pilhas e Filas

Estruturas de Dados 3

Pilha

Listas lineares especiais mais usuais

Pilhas e filas

Fila

LIFO Last In First Out

o último componente inserido

é o primeiro a ser retirado

FIFO First In First Out

o primeiro componente inserido

é também o primeiro a ser retirado

Page 4: Pilhas e Filas

Estruturas de Dados 4

Pilhas e Filas Consultas

Exclusões Inserções

Topo

Base

Início FinalInserções

Exclusõese

Consultas

PILHA

FILA

Page 5: Pilhas e Filas

Estruturas de Dados 5

Filas Duplas

Inserções e exclusões podem ocorrer em qualquer extremidade da lista

• Especialização de fila

exclusões

inserções exclusões

inserções

Page 6: Pilhas e Filas

Estruturas de Dados 6

Pilhas e filas

Pilhas

Page 7: Pilhas e Filas

Estruturas de Dados 7

Consultas

Exclusões Inserções

Topo

Base

• Criar uma pilha vazia

• Inserir um nodo no topo da pilha

• Remover o nodo do topo de pilha

• Consultar / modificar nodo do topo da pilha

• Destruir a pilha

Operações sobre Pilhas

Pilhas

Page 8: Pilhas e Filas

Estruturas de Dados 8

Pilhas

Pilhas implementadas por contiguidade física

Page 9: Pilhas e Filas

Estruturas de Dados 9

Pilha - contiguidade física Lim

Topo

Base

Pilha

Índicesdo arranjo

Pilha – contiguidade física

• Implementada sobre um arranjo

• Índices de controle da pilha:

• BASE da pilha

• TOPO atual da pilha

• LIMITE máximo que pode ser ocupado pela pilha

Page 10: Pilhas e Filas

Estruturas de Dados 10

Exemplo de manipulação de uma pilha

Retorna “7”

1. Inicializar pilha de valores inteiros, a partir do índice 1, máximo 10 nós

2. Inserir nodo com valor 3

3. Inserir nodo com valor 7

4. Inserir nodo com valor 5

5. Remover nodo do topo

6. Consultar pilha

Pilha – contiguidade física

LIM

TOPO

BASE

PILHA

10

9

8

7

6

5

4

3

2

13

LIM

TOPOBASE

10

9

8

7

6

5

4

3

2

137

LIM

TOPOBASE

10

9

8

7

6

5

4

3

2

1375

LIM

TOPO

BASE

10

9

8

7

6

5

4

3

2

137

LIM

TOPOBASE

10

9

8

7

6

5

4

3

2

1

PILHA PILHA PILHA PILHA

Page 11: Pilhas e Filas

Estruturas de Dados 11

Pilha – contiguidade física

TipoPilha = arranjo [1..N] de TipoNodo

Operações

Tipo de dados utilizado nos algoritmos para pilha implementada

por contiguidade física:

• Criar uma pilha vazia

• Inserir um nodo no topo da pilha

• Remover o nodo do topo de pilha

• Consultar / modificar nodo do topo da pilha

Page 12: Pilhas e Filas

Estruturas de Dados 12

1. Definir valor do índice de BASE da pilha

2. Definir valor máximo de nodos que a pilha pode ter LIM

3. Indicar que a pilha está vazia através do valor de TOPO

Lim

Topo

Base

Pilha

10

9

8

7

6

5

4

3

2

1

Exemplo:

Base ← 1Topo ← Base – 1Lim ← 6

Criação da pilha

Pilha – contiguidade física

Page 13: Pilhas e Filas

Estruturas de Dados 13

Algoritmo 4.1 - InicializarPilhaArr Entrada: Base (inteiro) Saída: Topo (inteiro)início Topo ← Base – 1fim

Algoritmo: Algoritmo: Inicializar Pilhas implementada sobre Arranjo

Pilha – contiguidade física

Page 14: Pilhas e Filas

Estruturas de Dados 14

Lim

Topo

Base

Pilha

10

9

8

7

6

5

4

3

2

1

Lim

Topo

Base

Pilha

10

9

8

7

6

5

4

3

2

1

Operação PUSH

Inserção de um nodo na pilhaPilha – contiguidade física

Page 15: Pilhas e Filas

Estruturas de Dados 15

Pilha – contiguidade física

Algoritmo: Algoritmo: Inicializar Pilhas implementada sobre Arranjo

Algoritmo 4.2 - InserirPilhaArr Entradas: Pilha (TipoPilha) Lim (inteiro) Topo (inteiro) Valor (TipoNodo) Saídas: Pilha (TipoPilha) Topo (inteiro) Sucesso (lógico)início se Topo < Lim então início Topo ← Topo + 1 Pilha[Topo] ← Valor Sucesso ← verdadeiro fim senão Sucesso ← falsofim

Page 16: Pilhas e Filas

Estruturas de Dados 16

Pilha – contiguidade física

Remoção de um nodo da pilhaRemoção de um nodo da pilha

Lim

Topo

Base

Pilha

10

9

8

7

6

5

4

3

2

1

Lim

Topo

Base

Pilha

10

9

8

7

6

5

4

3

2

1

Operação POP

Page 17: Pilhas e Filas

Estruturas de Dados 17

Algoritmo 4.3 - RemoverPilhaArr Entradas: Pilha (TipoPilha) Topo (inteiro) Base (inteiro) Saídas: Pilha (TipoPilha) Topo (inteiro) Sucesso (lógico) ValorRemovido (TipoNodo)início se Topo ≥ Base então início ValorRemovido ← Pilha[Topo] Topo ← Topo - 1 Sucesso ← verdadeiro fim senão Sucesso ← falsofim

Algoritmo: Algoritmo: Remover nodo do topo de Pilha implementada sobre Arranjo

Page 18: Pilhas e Filas

Estruturas de Dados 18

?

Lim

Topo

Base

Pilha

10

9

8

7

6

5

4

3

2

1

Pilha – contiguidade física

Acesso à pilha

• Somente ao nodo do topo da pilha

• Para consulta e/ou modificação

Page 19: Pilhas e Filas

Estruturas de Dados 19

Algoritmo 4.4 - ConsultarPilhaArr Entradas: Pilha (TipoPilha) Base (inteiro) Topo (inteiro) Saídas: Valor (TipoNodo) Sucesso(lógico)início se Topo ≥ Base então início Valor ← Pilha[Topo] Sucesso ← verdadeiro fim senão Sucesso ← falsofim

Algoritmo: Algoritmo: Consultar nodo do topo de Pilha implementada sobre Arranjo

Page 20: Pilhas e Filas

Estruturas de Dados 20

Pilhas

Pilhas implementadas por encadeamento

Page 21: Pilhas e Filas

Estruturas de Dados 21

Base

Topo

inserçõesremoções

?consultas

PtPilha

Info Elo

Topo da pilha

Base da pilha

Endereço do topo da pilha

Pilha implementada por encadeamento

TipoNodo = registro Info: TipoInfo Elo: TipoPtNodo fim registro

Tipo de dados utilizado nos algoritmos:

Page 22: Pilhas e Filas

Estruturas de Dados 22

Pilha por encadeamento

Criação de pilha encadeada

• Pilha criada vazia

• Atribuir endereço nulo para apontador que contém o

endereço do topo da pilha

Page 23: Pilhas e Filas

Estruturas de Dados 23

Algoritmo: Algoritmo: Criar Pilha Encadeada

Pilha por encadeamento

Algoritmo 4.5 - CriarPilhaEnc Entradas: - Saída: PtPilha (TipoPtNodo)início PtPilha ← nulofim

Page 24: Pilhas e Filas

Estruturas de Dados 24

Inserção de um nodo em pilha encadeada

Pilha por encadeamento

• Novo nodo inserido sempre no topo da pilha

Topo

TopoPtPilha PtPilha

Topo

Novo nodo

Base Base

Page 25: Pilhas e Filas

Estruturas de Dados 25

Algoritmo 4.6 - InserirPilhaEnc Entradas: PtPilha (TipoPtNodo) Valor (TipoInfo) Saída: PtPilha (TipoPtNodo) Variável local: PtNovo (TipoPtNodo)início alocar(PtNovo) PtNovo↑.Info ← Valor PtNovo↑.Elo ← PtPilha PtPilha ← PtNovofim

Algoritmo: Algoritmo: Inserir nodo em Pilha Encadeada

Pilha por encadeamento

Page 26: Pilhas e Filas

Estruturas de Dados 26

Remoção de um nodo de uma pilha encadeada

Pilha por encadeamento

• Só pode ser removido o nodo do topo da pilha

PtPilha

Topo

Topo

PtPilha

Base Base

Nodo a ser removido

Page 27: Pilhas e Filas

Estruturas de Dados 27

Pilha por encadeamento

Algoritmo: Algoritmo: Remover nodo de Pilha Encadeada

Algoritmo 4.7 - RemoverPilhaEnc Entrada: PtPilha (TipoPtNodo) Saídas: PtPilha (TipoPtNodo) Sucesso (lógico) Variável local: PtAux (TipoPtNodo)início se PtPilha ≠ nulo então início PtAux ← PtPilha PtPilha ← PtPilha↑.Elo liberar(PtAux) Sucesso ← verdadeiro fim senão Sucesso ← falsofim

Page 28: Pilhas e Filas

Estruturas de Dados 28

Acesso à pilha encadeada

Pilha por encadeamento

• Só pode ser acessado o nodo do topo da pilha

Topo

PtPilha

Base

Nodo que pode ser acessado

Page 29: Pilhas e Filas

Estruturas de Dados 29

Pilha por encadeamento

Algoritmo: Algoritmo: Consultar nodo do topo de Pilha Encadeada

Algoritmo 4.8 - ConsultarPilhaEnc Entrada: PtPilha (TipoPtNodo) Saídas: Valor (TipoInfo) Sucesso (lógico) início se PtPilha = nulo então Sucesso ← falso senão início Sucesso ← verdadeiro Valor ← PtPilha↑.Info fimfim

Page 30: Pilhas e Filas

Estruturas de Dados 30

Pilha por encadeamento

Algoritmo: DesempilharAlgoritmo: DesempilharConsulta nodo do topo da pilha, e o remove da pilha

Algoritmo 4.9 - Desempilhar Entrada: PtPilha (TipoPtNodo) Saídas: PtPilha (TipoPtNodo) Valor (TipoInfo) Sucesso (lógico) Variável local: PtAux (TipoPtNodo)início se PtPilha = nulo então Sucesso ← falso senão início Sucesso ← verdadeiro Valor ← PtPilha↑.Info PtAux ← PtPilha PtPilha ← PtPilha↑.Elo liberar(PtAux) fimfim

Page 31: Pilhas e Filas

Estruturas de Dados 31

PtPilha = nilBase

Topo

Base

Topo

Base

Topo

Base

Topo

PtPilha

PtPilha

PtPilha

Destruição de uma pilha encadeada

Pilha por encadeamento

• Liberar espaço ocupado pelos nodos, sempre a partir do topo da pilha

• No final: apontador para o topo = endereço nulo

Page 32: Pilhas e Filas

Estruturas de Dados 32

Pilha por encadeamento

Algoritmo: Algoritmo: Destruir Pilha Encadeada

Algoritmo 4.10 - DestruirPilhaEnc Entrada: PtPilha (TipoPtNodo) Saída: PtPilha (TipoPtNodo) Variável local: PtAux (TipoPtNodo)início enquanto PtPilha ≠ nulo faça início PtAux ← PtPilha PtPilha ← PtPilha↑.Elo liberar(PtAux) fimfim

Page 33: Pilhas e Filas

Estruturas de Dados 33

Pilhas e filas

Filas

Page 34: Pilhas e Filas

Estruturas de Dados 34

Filas

Operações válidas:Operações válidas:

• Criar uma fila vazia

• Inserir um nodo no final da fila

• Excluir o nodo do início da fila

• Consultar / modificar nodo do início da fila

• Destruir a fila

InserçõesExclusões

eConsultas

FinalInício

Filas

Page 35: Pilhas e Filas

Estruturas de Dados 35

Filas

Filas implementadas por contiguidade física

Page 36: Pilhas e Filas

Estruturas de Dados 36

LI : limite inferior da área

IF : início da fila

FF : final da fila

LS : limite superior da área

Fila vaziaFila vazia

IF = 0

Inserções

ExclusõeseConsultas

Fila implementada sobre arranjo

1 2 3 4 5 6 7 8 9 10 12 13 14

LI LSIF FF

FILA

Fila por contiguidade

Page 37: Pilhas e Filas

Estruturas de Dados 37

Evolução da Fila

Fila por contiguidade

2. Inicializar a fila

3. Inserir um novo nodo com valor 3

4. Inserir um novo nodo com valor 7

5. Inserir um novo nodo com valor 5

6. Remover um nodo

FILA

1 2 43 65

1 2 43 65

FILA

LI=IF=FF LS

3

1 2 43 65

FILA

LI=IF LS

3 7

FF

1 2 43 65

FILA

LI=IF LS

3 7 5

FF

1 2 43 65

FILA

LI LS

7 5

FFIF

Page 38: Pilhas e Filas

Estruturas de Dados 38

Ocupação circular do arranjo

LSFFIF

LI

FILA1 2 3 4 5 6 7 8 9 10 12 13 14

1 2 3 4 5 6 7 8 9 10 12 13 14LSFFIFLI

FILA

1 2 3 4 5 6 7 8 9 10 12 13 14LSFFIFLI

FILA

1 2 3 4 5 6 7 8 9 10 12 13 14LS

FFIFLI

FILA

1 2 3 4 5 6 7 8 9 10 12 13 14LSFF IFLI

FILA

Fila por contiguidade

Page 39: Pilhas e Filas

Estruturas de Dados 39

Operações sobre Filasimplementadas por contiguidade

Fila por contiguidade

• Criar uma fila vazia

• Inserir um nodo no final da fila

• Excluir o nodo do início da fila

• Consultar / modificar nodo do início da fila

TipoFila = arranjo [1..N] de TipoNodo

Tipo de dados utilizado nos algoritmos para fila implementada

por contiguidade física:

Page 40: Pilhas e Filas

Estruturas de Dados 40

... ...FFIF LI LS

Espaço disponível para a fila

FILA

Criação de uma fila

Fila por contiguidade

• Inicializar variáveis que controlam início e final da fila e início

e final da área disponível para a fila

Page 41: Pilhas e Filas

Estruturas de Dados 41

Algoritmo: Algoritmo: Inicializar Fila implementada sobre Arranjo

Fila por contiguidade

Algoritmo 4.11 - InicializarFilaArr Entrada: LI (inteiro) Saídas: IF, FF (inteiros)início IF ← FF ← LI – 1fim

Page 42: Pilhas e Filas

Estruturas de Dados 42

Testar se tem espaço livre para inserir:

... ... atrás

na frente... ...

no meio... ...

LI

LI

LI

LS

LS

LS

IF

IF

IF

FF

FF

FF

Inserção de um nodo em uma fila

Fila por contiguidade

• Nodo inserido sempre no final da fila

Page 43: Pilhas e Filas

Estruturas de Dados 43

Algoritmo: Algoritmo: Inserir um nodo em uma Fila implementada sobre Arranjo

Algoritmo 4.12 - InserirFilaArr Entradas: Fila (TipoFila) LI, LS, IF, FF (inteiros) Info (TipoNodo) Saídas: IF, FF (inteiros) Sucesso (lógico)início se (FF ≠ IF - 1) e ((IF ≠ LI) ou (FF ≠ LS)) então início se IF = LI - 1 então IF ← FF ← LI {INSERÇÃO DO PRIMEIRO NODO} senão se FF = L então FF ← LI {INSERÇÃO NO INÍCIO} senão FF ← FF + 1 {INSERÇÃO NO MEIO OU ATRÁS} FILA[FF] ← Info Sucesso ← verdadeiro fim senão Sucesso ← falsofim

Page 44: Pilhas e Filas

Estruturas de Dados 44

Remoção de um nodo de uma fila

Fila por contiguidade

• Nodo removido é sempre o do início da fila

1 2 3 4 5 6 7 8 9 10 12 13 14LSFFIFLI

FILA

1 2 3 4 5 6 7 8 9 10 12 13 14LSFFIFLI

FILA

Nodo que pode ser removido

Page 45: Pilhas e Filas

Estruturas de Dados 45

Algoritmo: Algoritmo: Remover um nodo de uma Fila implementada sobre Arranjo

Algoritmo 4.13 - RemoverFilaArr Entradas: LI, LS, IF, FF (inteiros) Saídas: IF, FF (inteiros) Sucesso (lógico)início se IF ≠ LI - 1 então início se IF = FF então IF ← FF ← LI - 1 {FILA FICA VAZIA} senão se IF = LS então IF ← LI senão IF ← IF + 1 Sucesso ← verdadeiro fim senão Sucesso ← falsofim

Page 46: Pilhas e Filas

Estruturas de Dados 46

Acesso à fila

Fila por contiguidade

• Só o nodo do início da fila pode ser acessado

• Acesso para consulta e/ou alteração

?... ...LSFFIFLI

Nodo que pode ser acessado

Page 47: Pilhas e Filas

Estruturas de Dados 47

Algoritmo: Algoritmo: Consultar Fila implementada sobre Arranjo

Fila por contiguidade

Algoritmo 4.14 - ConsultarFilaArr Entradas: Fila (TipoFila) LI, IF (inteiros) Saídas: Info (TipoNodo) Sucesso (lógico)início se IF ≠ LI - 1 então início Info ← Fila[IF] Sucesso ← verdadeiro fim senão Sucesso ← falsofim

Page 48: Pilhas e Filas

Estruturas de Dados 48

Filas

Filas implementadas por encadeamento

Page 49: Pilhas e Filas

Estruturas de Dados 49

InserçõesExclusões e

Consultas

FinalFrente

Filas implementadas por encadeamento

Filas por encadeamento

TipoNodo = registro Info: TipoInfo Elo: TipoPtNodo fim registro

Tipo de dados para nodos da fila:

F1 FnF3F2

PtFila

Endereço do primeiro da fila, para remoção

Endereço do final da fila, para inserção

Info Elo

Para acessar o último nodo, é necessário percorrer toda a fila a partir do primeiro nodo

Page 50: Pilhas e Filas

Estruturas de Dados 50

Descritor

Prim: primeiro da fila

Ult : último da fila

Filas por encadeamento com descritor

Filas por encadeamento

PtDF

Prim Ult

L1 L2 L4L3

TipoDFila = registro Prim: TipoPtNodo Ult: TipoPtNodo fim registroTipoPtDFila = ↑TipoDFila

Tipo de dados para o descritor da fila:

Page 51: Pilhas e Filas

Estruturas de Dados 51

Operações sobre Filas implementadas por encadeamento com descritor

• Criar uma fila vazia

• Inserir um nodo no final da fila

• Excluir o nodo do início da fila

• Consultar / modificar nodo do início da fila

• Destruir a fila

Filas por encadeamento

Page 52: Pilhas e Filas

Estruturas de Dados 52

Filas por encadeamento

• Alocar o descritor da fila

• Descritor inicializado em endereços nulos

• Fila vazia

Criação da fila encadeada

PtDF

Prim Ult

Page 53: Pilhas e Filas

Estruturas de Dados 53

Algoritmo: Algoritmo: Criar Fila Encadeada endereçada por descritor

Filas por encadeamento

Algoritmo 4.15 - CriarFilaEnc Entradas: - Saída: PtDFila (TipoPtDFila)início alocar(PtDFila) PtDFila↑.Prim ← nulo PtDFila↑.Ult ← nulo fim

Page 54: Pilhas e Filas

Estruturas de Dados 54

Filas por encadeamento

Inserção de um nodo na fila encadeada

PtDFila Prim Ult

/

PtDFila Prim UltPtDFila Prim Ult

PtDFila Prim Ult

Page 55: Pilhas e Filas

Estruturas de Dados 55

Algoritmo: Algoritmo: Inserir novo nodo em Fila Encadeadaendereçada por descritor

Filas por encadeamento

Algoritmo 4.16 - InserirFilaEnc Entradas: PtDFila (TipoPtDFila) Valor (TipoInfo) Saídas: - Variável auxiliar: PtNovo (TipoPtNodo)início alocar(PtNovo) PtNovo↑.Info ← Valor PtNovo↑.Elo ← nulo se PtDFila↑.Prim = nulo então PtDFila↑.Prim ← PtNovo senão (PtDFila↑.Ult)↑.Prox ← PtNovo PtDFila↑.Ult ← PtNovofim

Page 56: Pilhas e Filas

Estruturas de Dados 56

Filas por encadeamento

Remoção de um nodo de fila encadeada

PtDFila Prim Ult

/

PtDFila Prim Ult

/

PtDFila Prim Ult

/

PtDFila Prim Ult

Page 57: Pilhas e Filas

Estruturas de Dados 57

Algoritmo: Algoritmo: Remover um nodo de Fila Encadeadaendereçada por descritor

Filas por encadeamento

Algoritmo 4.17 - RemoverFilaEnc Entrada: PtDFila (TipoPtDFila) Saída: Sucesso (lógico) Variável auxiliar: PtAux (TipoPtNodo)início se PtDFila↑.Prim ≠ nulo então início PtAux ← PtDFila↑.Prim PtDFila↑.Prim ← PtAux↑.Elo liberar(PtAux) se PtDFila↑.Prim = nulo então PtDFila↑.Ult ← nulo Sucesso ← verdadeiro fimsenão Sucesso ← falsofim

Page 58: Pilhas e Filas

Estruturas de Dados 58

PtDFila Prim Ult

/??

Filas por encadeamento

Remoção de um nodo de fila encadeada

• Só o nodo do início da fila pode ser acessado

• Acessado diretamente pelo endereço no descritor

Page 59: Pilhas e Filas

Estruturas de Dados 59

Algoritmo: Algoritmo: Consultar Fila Encadeada endereçada por descritor

Filas por encadeamento

Algoritmo 4.18 - ConsultarFilaEnc Entrada: PtDFila (TipoPtDFila) Saídas: Valor (TipoInfo) Sucesso (lógico)início se PtDFila↑.Prim ≠ nulo então início Valor ← PtDFila↑.Prim↑.Info Sucesso ← verdadeiro fim senão Sucesso ← falsofim

Page 60: Pilhas e Filas

Estruturas de Dados 60

Filas por encadeamento

Destruição de fila encadeada

PtDFila

/

Prim Ult

PtDFila Prim Ult

PtDFila = nulo

Liberar posições

ocupadas pela lista

Liberar descritor

Page 61: Pilhas e Filas

Estruturas de Dados 61

Algoritmo: Algoritmo: Destruir Fila Encadeada endereçada por descritor

Filas por encadeamento

Algoritmo 4.19 - DestruirFilaEnc Entrada: PtDFila (TipoPtDFila) Saída: PtDFila (TipoPtDFila) Variáveis auxiliares: P1, P2 (TipoPtNodo)início se PtDFila↑.Prim ≠ nulo então início P1 ← PtDFila↑.Prim repita P2 ← P1↑.Elo liberar(P1) P1 ← P2 até P1 = nulo fim liberar(PtDFila) PtDFila ← nulofim

Page 62: Pilhas e Filas

Estruturas de Dados 62

Filas

Fila dupla - Deque

Page 63: Pilhas e Filas

Estruturas de Dados 63

ConsultasConsultas

Início Final

Exclusões

Inserções

Exclusões

Inserções

Fila dupla

Fila dupla - Deque

• Inserção, remoção e acesso às duas extremidades

Page 64: Pilhas e Filas

Estruturas de Dados 64

Operações válidas:Operações válidas:

• Criar uma fila dupla vazia

• Inserir um nodo no início

• Inserir um nodo no fim

• Excluir um nodo do início

• Excluir um nodo do fim

• Consultar / modificar nodo do início ou do fim

• Destruir a fila dupla

Fila dupla

Fila dupla - Deque

Page 65: Pilhas e Filas

Estruturas de Dados 65

Fila dupla

Fila dupla implementada por contiguidade física

Page 66: Pilhas e Filas

Estruturas de Dados 66

LI : limite inferior da área no arranjoIF : início da filaFF : final da filaLS : limite superior da área disponível

1 2 3 4 5 6 7 8 9 10 12 13 14

LI LSIF FF

Deque

Fila dupla por contiguidade

Fila dupla implementada sobre arranjo

ConsultasConsultas

Início Final

Exclusões

Inserções

Exclusões

Inserções

TipoFila = arranjo [1..N] de TipoNodo

Tipo de dados para fila dupla por contiguidade:

Page 67: Pilhas e Filas

Estruturas de Dados 67

Criação de uma fila dupla

• Inicializar indicadores de início e final da fila

dupla

• Fila criada vazia

0 1 2 3 4 5 6 7 8 9 10 12 13 14

LI LSIF

FF

Deque

Fila dupla por contiguidade

Page 68: Pilhas e Filas

Estruturas de Dados 68

Algoritmo: Algoritmo: Inicializar Deque implementada sobre Arranjo

Algoritmo 4.20 - InicializarDequeArr Entrada: LI (inteiro) Saídas: IF, FF (inteiros)início IF ← FF ← LI – 1fim

Fila dupla por contiguidade

Page 69: Pilhas e Filas

Estruturas de Dados 69

Inserção de um nodo em uma fila dupla

Fila dupla por contiguidade

• A inserção pode ser feita em qualquer uma das duas extremidades

• Definir em qual extremidade deve ser inserido o novo nodo

• Ocupação circular do arranjo

Início Final

Inserção Inserção

Page 70: Pilhas e Filas

Estruturas de Dados 70

LSFFLI

DEQUE1 2 3 4 5 6 7 8 9 10 12 13 14

LSFFIFLI1 2 3 4 5 6 7 8 9 10 12 13 14

IF

DEQUE

LSFF

LI1 2 3 4 5 6 7 8 9 10 12 13 14

LSFF

IFLI1 2 3 4 5 6 7 8 9 10 12 13 14

IF

DEQUE

DEQUE

Inserção no final

Ocupação circular do arranjo:

Fila dupla por contiguidade

Page 71: Pilhas e Filas

Estruturas de Dados 71

LSFFLI

DEQUE1 2 3 4 5 6 7 8 9 10 12 13 14

LSFFIFLI1 2 3 4 5 6 7 8 9 10 12 13 14

IF

DEQUE

LSFFLI1 2 3 4 5 6 7 8 9 10 12 13 14

LSFFIF

LI1 2 3 4 5 6 7 8 9 10 12 13 14

IF

DEQUE

DEQUE

Inserção no início

Ocupação circular do arranjo:

Fila dupla por contiguidade

Page 72: Pilhas e Filas

Estruturas de Dados 72

Algoritmo: Algoritmo: Inserir um nodo no Início de Dequeimplementada sobre ArranjoAlgoritmo 4.21 - InserirIniDequeArr Entrada: Deque (TipoDequeArr) LI, LS, IF, FF (inteiros) Info (TipoNodo) Saídas: Deque (TipoDequeArr) IF, FF (inteiros) Sucesso (lógico)início se ((FF = IF - 1) ou ((IF = LI) e (FF = LS))) então Sucesso ← falso senão início Sucesso ← verdadeiro se IF = LI – 1 {DEQUE VAZIA} então IF ← FF ← LI senão se IF > LI então IF ← IF – 1 senão IF ← LS Deque[IF] ← Info fimfim

Page 73: Pilhas e Filas

Estruturas de Dados 73

Remoção de um nodo de uma fila dupla

Fila dupla por contiguidade

• A remoção pode ser feita em qualquer uma das duas extremidades

• Definir de qual extremidade deve ser removido o novo nodo

Início Final

Remoção Remoção

Page 74: Pilhas e Filas

Estruturas de Dados 74

Algoritmo: Algoritmo: Remover o nodo do Fim da Dequeimplementada sobre Arranjo

Algoritmo 4.22 - RemoverFimDequeArr Entradas: LI, LS, IF, FF (inteiros) Saídas: IF, FF (inteiros) Sucesso (lógico)início se IF ≠ LI – 1 então início se IF = FF {DEQUE VAI FICAR VAZIA} então IF ← FF ← LI - 1 senão se FF = LI então FF ← LS senão FF ← FF - 1 Sucesso ← verdadeiro fim senão Sucesso ← falsofim

Page 75: Pilhas e Filas

Estruturas de Dados 75

Acesso a uma fila dupla

Fila dupla por contiguidade

Início Final

Acesso Acesso

• Somente os nodos das duas extremidades podem ser acessados

Page 76: Pilhas e Filas

Estruturas de Dados 76

Algoritmo: Algoritmo: Consultar qual o Maior valor contido nas extremidades de uma Deque implementada sobre Arranjo

Algoritmo 4.23 - ConsultarMaiorDequeArr Entradas: Deque (TipoDequeArr) LI, IF, FF (inteiros) Saída: MaiorValor (inteiro)início se IF = LI - 1 então MaiorValor ← 0 senão se Deque[IF] > Deque[FF] então MaiorValor ← Deque[IF] senão MaiorValor ← Deque[FF]fim

Page 77: Pilhas e Filas

Estruturas de Dados 77

Fila dupla

Fila dupla implementada por contiguidade física

Page 78: Pilhas e Filas

Estruturas de Dados 78

F1 FnF3F2

PtFilaDupla

Início

Final

Fila dupla implementada por encadeamento

Fila dupla por encadeamento

Exclusões

InserçõesAcesso

Exclusões

InserçõesAcesso

Para acessar o último nodo, é necessário percorrer toda a lista a partir do primeiro nodo

Page 79: Pilhas e Filas

Estruturas de Dados 79

Fila dupla encadeada com descritorFila dupla por encadeamento

PtDFD

/

Prim Ult

Na remoção do último nodo, precisa atualizar descritor

que passará a apontar para o penúltimo – percorrer a

fila do início para chegar ao penúltimo

Page 80: Pilhas e Filas

Estruturas de Dados 80

TipoNodo = registro Ant: TipoPtNodo Info: TipoInfoNodo Prox: TipoPtNodo

fim registro

Tipo de dados para nodos da fila dupla:

TipoDDeque = registro Prim: TipoPtNodo Ult: TipoPtNodo fim registoTipoPtDDeque = ↑TipoDDeque

Tipo de dados para o descritor da fila dupla:

Descritor

Prim: primeiro da filaUlt : último da fila

PtDFDPrim Ult

Ant Info Prox

Fila dupla – duplo encadeamento e descritor

Fila dupla por encadeamento

Page 81: Pilhas e Filas

Estruturas de Dados 81

Criação de fila dupla encadeada

Fila dupla por encadeamento

• Alocação do descritor

• Inicialização do descritor para fila dupla vazia

PtDFDPrim Ult

Page 82: Pilhas e Filas

Estruturas de Dados 82

Algoritmo 4.24 - CriarDequeEnc Entradas: - Saída: PtDDeque (TipoPtDDeque)início alocar(PtDDeque) PtDDeque↑.Prim ← PtDDdeque↑.Ult ← nulo fim

Algoritmo: Algoritmo: Criar Deque implementada por Encadeamento

Fila dupla por encadeamento

Page 83: Pilhas e Filas

Estruturas de Dados 83

Inserção de um novo nodo

Fila dupla por encadeamento

PtDFDPrim Ult

PtDFDPrim Ult

A

CA B

B N

N

C

PtDFDPrim Ult

CA B

No início

No final

Page 84: Pilhas e Filas

Estruturas de Dados 84

Algoritmo: Algoritmo: Inserir nodo em Deque Encadeada

Algoritmo 4.25 - InserirDequeEnc Entradas: PtDeque (TipoPtDeque) Lado (caractere) Valor (TipoInfoNodo) Saída: Sucesso (lógico)var PtNovo (TipoPtNodo)início Sucesso ← falso se (Lado = “I”) ou (Lado = “F”) então início Sucesso ← verdadeiro alocar(PtNovo) PtNovo↑.Info ← Valor se Lado = “I” { então início {INSERE NO INÍCIO} SEGUE }

Fila dupla por encadeamento

Page 85: Pilhas e Filas

Estruturas de Dados 85

então início {INSERE NO INÍCIO} PtNovo↑.Ant ← nulo se PtDDeque↑.Prim = nulo então início PtDDeque↑.Ult ← PtNovo PtNovo↑.Prox ← nulo fim senão início PtNovo↑.Prox ← PtDDeque↑.Prim (PtDDeque↑.Prim)↑.Ant ← PtNovo fim PtDDeque↑.Prim ← PtNovo fim senão início {INSERE NO FINAL} PtNovo↑.Prox ← nulo se PtDDeque↑.Prim = nulo então início PtNovo↑.Ant ← nulo PtDDeque↑.Prim ← PtNovo fim senão início (PtDDeque↑.Ult)↑.Prox ← PtNovo PtNovo↑.Ant ← PtDDeque↑.Ult fim PtDDeque↑.Ult ← PtNovo fim fimfim

Algoritmo (cont): Algoritmo (cont): Inserir nodo em Deque Encadeada

Page 86: Pilhas e Filas

Estruturas de Dados 86

Remoção de um nodo

Fila dupla por encadeamento

PtDFDPrim Ult

PtDFDPrim Ult

A

CA B

B X

X

C

Do final

Do início

PtDFDPrim Ult

CA B

Page 87: Pilhas e Filas

Estruturas de Dados 87

Algoritmo: Algoritmo: Remover nodo de Deque Encadeada

Fila dupla por encadeamento

Algoritmo 4.26 - RemoverDequeEnc Entradas: PtDDeque (TipoPtDDeque) Lado (caractere) Saída: Sucesso (lógico)var PtAux, PtAnt (TipoPtNodo);início Sucesso ← falso se (PtDDeque↑.Prim ≠ nulo) e ((Lado = “I”) ou (Lado = “F”)) então início Sucesso ← verdadeiro se Lado = “I” { então início {REMOVE O PRIMEIRO} SEGUE }

Page 88: Pilhas e Filas

Estruturas de Dados 88

então início {REMOVE O PRIMEIRO} PtAux ← PtDDeque↑.Prim se PtDDeque↑.Prim = PtDDeque↑.Ult então PtDDeque↑.Prim ← PtDDeque↑.Ult ← nulo senão início PtDDeque↑.Prim ← PtAux↑.Prox (PtDDeque↑.Prim)↑.Ant ← nulo fim fim senão início {REMOVE O ÚLTIMO} PtAux ← PtDDeque↑.Ult se PtDDeque↑.Prim = PtDDeque↑.Ult então PtDDeque↑.Prim ← PtDDeque↑.Ult ← nulo senão início PtDDeque↑.Ult ← PtAux↑.Ant (PtDDeque↑.Ult)↑.Prox ← nulo fim fim liberar(PtAux) fimfim

Algoritmo (cont.): Algoritmo (cont.): Remover nodo de Deque Encadeada

Page 89: Pilhas e Filas

Estruturas de Dados 89

Acesso a fila dupla encadeada

Fila dupla por encadeamento

Início FinalAcesso Acesso

PtDFD

Prim Ult

CA BX

• Podem ser acessados o primeiro e último nodo

• Endereços diretamente no descritor

Page 90: Pilhas e Filas

Estruturas de Dados 90

Algoritmo: Algoritmo: Consultar Deque implementada por Encadeamento

Fila dupla por encadeamento

Algoritmo 4.27 - ConsultarDequeEnc Entradas: PtDDeque (TipoPtDDeque) Lado (caractere) Saídas: Valor (TipoInfoNodo) Sucesso (lógico)início Sucesso ← falso se (PtDDeque↑.Prim ≠ nulo) e ((Lado = “I”) ou (Lado = “F”)) então início Sucesso ← verdadeiro se Lado = “I” então Valor ← (PtDDeque↑.Prim).Info senão Valor ← (PtDDeque↑.Ult).Info; fimfim