pilhas e filas

Post on 04-Jul-2015

15.076 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

Estruturas de Dados 1

Pilhas e filas

Estudo de listas lineares especiais, com disciplina restrita

de organização e de acesso a seus nodos

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

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

Estruturas de Dados 4

Pilhas e Filas Consultas

Exclusões Inserções

Topo

Base

Início FinalInserções

Exclusõese

Consultas

PILHA

FILA

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

Estruturas de Dados 6

Pilhas e filas

Pilhas

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

Estruturas de Dados 8

Pilhas

Pilhas implementadas por contiguidade física

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

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

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

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

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

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

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

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

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

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

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

Estruturas de Dados 20

Pilhas

Pilhas implementadas por encadeamento

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:

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

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

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

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

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

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

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

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

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

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

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

Estruturas de Dados 33

Pilhas e filas

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

Estruturas de Dados 35

Filas

Filas implementadas por contiguidade física

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

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

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

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:

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

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

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

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

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

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

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

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

Estruturas de Dados 48

Filas

Filas implementadas por encadeamento

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

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:

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

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

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

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

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

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

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

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

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

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

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

Estruturas de Dados 62

Filas

Fila dupla - Deque

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

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

Estruturas de Dados 65

Fila dupla

Fila dupla implementada por contiguidade física

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:

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

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

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

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

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

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

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

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

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

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

Estruturas de Dados 77

Fila dupla

Fila dupla implementada por contiguidade física

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

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

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

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

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

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

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

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

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

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 }

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

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

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

top related