Post on 22-Apr-2015
04/11/23 EDA - Prof. Paulemir Campos 1
Pilhas e Filas usando Alocação Estática e Dinâmica de
Memória
UPE – Caruaru – Sistemas de InformaçãoDisciplina: Estrutura de Dados e ArquivoProf.: Paulemir G. Campos
04/11/23 EDA - Prof. Paulemir Campos 2
Pilhas: Introdução
Definição É uma estrutura de
dados de tamanho variável, sendo que elementos são incluídos (empilhados) e/ou removidos (desempilhados) apenas pela extremidade topo.
15
12
99
54
102
77
Topo
Base
04/11/23 EDA - Prof. Paulemir Campos 3
Pilhas: Introdução
Note que uma pilha é uma estrutura de dados do tipo FILO (First In Last Out).
Isto porquê o primeiro elemento empilhado é sempre o último a ser desempilhado.
04/11/23 EDA - Prof. Paulemir Campos 4
Pilhas: Introdução
Operações Básicas:
Teste de pilha vazia; Criação da pilha; Empilhamento; Desempilhamento; Acesso aos elementos da pilha.
04/11/23 EDA - Prof. Paulemir Campos 5
Pilhas: Introdução
Do ponto de vista da alocação de memória para esse tipo de estrutura de dados, podem ser implementadas usando: Alocação Estática: Em geral através de
arranjo ou vetor; Alocação Dinâmica: Utilizando ponteiro.
Normalmente com lista simplesmente encadeada.
04/11/23 EDA - Prof. Paulemir Campos 6
Pilhas: Alocação Estática
Características: Teste de Pilha Vazia: Tamanho do Vetor é
zero; Cria-se um vetor de tamanho suficientemente
grande para a finalidade de uso; Quando um elemento é empilhado o índice
do topo é acrescido em 1; Quando um elemento é desempilhado (se
possível) o índice do topo é decrescido em 1.
04/11/23 EDA - Prof. Paulemir Campos 7
Pilhas: Alocação Estática
Características: Geralmente há uma variável do tipo inteiro
chamada topo, para armazenar o índice do vetor correspondente ao topo da pilha;
Caso o vetor comece em 1, uma pilha vazia teria topo=0.
Neste caso, uma pilha estaria vazia se topo=0.
O acesso ao elementos é feito pelo topo, bem como empilhamentos e desempilhamentos.
04/11/23 EDA - Prof. Paulemir Campos 8
Pilhas: Alocação Dinâmica
Considere a definição do tipo tPilhaSimples abaixo:
defina estrutura no {caracter dadoponteiro estrutura no proximo
} tPilhaSimples
04/11/23 EDA - Prof. Paulemir Campos 9
Pilhas: Alocação Dinâmica
Criando uma pilha unitária:ponteiro tPilhaSimples func CriaPilha(caracter
novo){ponteiro tPilhaSimples topo topo = aloque(tPilhaSimples)topo->dado = novotopo->proximo = NULLretorne topo
}
04/11/23 EDA - Prof. Paulemir Campos 10
Pilhas: Alocação Dinâmica
Teste de pilha vazia:
booleano func PilhaVazia(ponteiro tPilhaSimples topo){
se (topo == NULL) retorne TRUEsenao retorne FALSE
}
04/11/23 EDA - Prof. Paulemir Campos 11
Pilhas: Alocação Dinâmica
Empilhando um elemento:
ponteiro tPilhaSimples func Empilha (ponteiro tPilhaSimples topo; caracter novo) {
ponteiro tPilhaSimples novoTopo
novoTopo = aloque(tPilhaSimples)se (novoTopo == NULL) retorne topo /* Erro durante a
alocação dinâmica de memória */
novoTopo->dado = novonovoTopo->proximo = toporetorne novoTopo
}
04/11/23 EDA - Prof. Paulemir Campos 12
Pilhas: Alocação Dinâmica
Desempilhando um elemento:
ponteiro tPilhaSimples func Desempilha (ponteiro tPilhaSimples topo) {ponteiro tPilhaSimples novoTopo
se (Topo == NULL) retorne topo /* Pilha vazia */novoTopo = topo->proximodesaloque(topo)retorne novoTopo
}
04/11/23 EDA - Prof. Paulemir Campos 13
Pilhas: Alocação Dinâmica
Acessando elementos da pilha
Como estamos usando uma lista simplesmente encadeada podemos acessar todos os elementos da pilha, apartir do topo, fazendo pequenos ajustes na função de acesso aos elementos de uma lista simples para uso com o tipo pilha, sem ter a necessidade de desempilhá-los.
04/11/23 EDA - Prof. Paulemir Campos 14
Filas: Introdução
Definição É uma estrutura de dados de tamanho
variável, sendo que elementos são incluídos (enfileirados) pelo fim da fila e removidos (desenfileirados) pelo início da fila.
15 12 19 51 7 213 54 99 88
INÍCIO FIM
04/11/23 EDA - Prof. Paulemir Campos 15
Filas: Introdução
Note que uma fila é uma estrutura de dados do tipo FIFO (First In First Out).
Isto porquê o primeiro elemento enfileirado é sempre o primeiro a ser desenfileirado.
04/11/23 EDA - Prof. Paulemir Campos 16
Filas: Introdução
Operações Básicas:
Teste de fila vazia; Criação da fila; Enfileiramento; Desenfileiramento; Acesso aos elementos da fila.
04/11/23 EDA - Prof. Paulemir Campos 17
Filas: Introdução
Do ponto de vista da alocação de memória para esse tipo de estrutura de dados, podem ser implementadas usando: Alocação Estática: Em geral através de
arranjo ou vetor; Alocação Dinâmica: Utilizando ponteiro.
Normalmente com lista simplesmente encadeada.
04/11/23 EDA - Prof. Paulemir Campos 18
Filas: Alocação Estática
Características: Teste de Fila Vazia: Índice fim menor que
inicio; Cria-se um vetor de tamanho suficientemente
grande para a finalidade de uso; Quando um elemento é enfileirado o valor do
fim é igual ao tamanho do vetor; Quando um elemento é desenfileirado (se
possível) o valor do inicio é acrescido em 1.
04/11/23 EDA - Prof. Paulemir Campos 19
Filas: Alocação Estática
Características: Note que, desta forma, posições vão se
perdendo na fila estática. Um solução, é deslocar o conteúdo do vetor
em uma posição no sentido do índice inicial do vetor.
Assim, como o início será sempre um mesmo valor, há apenas a necessidade da variável fim.
04/11/23 EDA - Prof. Paulemir Campos 20
Filas: Alocação Dinâmica
Considere a definição do tipo tFilaSimples abaixo:
defina estrutura no {caracter dadoponteiro estrutura no proximo
} tFilaSimples
04/11/23 EDA - Prof. Paulemir Campos 21
Filas: Alocação Dinâmica
Criando uma fila unitária:ponteiro tFilaSimples func CriaFila(caracter
novo){ponteiro tFilaSimples inicio inicio = aloque(tFilaSimples)inicio->dado = novoinicio->proximo = NULLretorne inicio
}
04/11/23 EDA - Prof. Paulemir Campos 22
Filas: Alocação Dinâmica
Teste de fila vazia:
booleano func FilaVazia(ponteiro tFilaSimples inicio){
se (inicio == NULL) retorne TRUEsenao retorne FALSE
}
04/11/23 EDA - Prof. Paulemir Campos 23
Filas: Alocação Dinâmica Enfileirando um elemento:
ponteiro tFilaSimples func Enfileira (ponteiro tFilaSimples inicio; caracter elemento) {
ponteiro tFilaSimples temp, novotemp = cabeca /* Considere que inicio não é um ponteiro nulo *//* Percorre a fila até encontrar o último elemento */enquanto (temp->proximo != NULL)
temp = temp->proximo/* Enfileira o novo elemento no fim da fila */novo = aloque(tFilaSimples)novo->dado = Elementonovo->proximo = temp->proximotemp->proximo = novoretorne inicio
}
04/11/23 EDA - Prof. Paulemir Campos 24
Filas: Alocação Dinâmica
Desenfileirando um elemento:
ponteiro tFilaSimples func Desenfileira (ponteiro tFilaSimples inicio) {ponteiro tFilaSimples novoInicio
se (inicio == NULL) retorne inicio /* Fila vazia */novoInicio = inicio->proximodesaloque(inicio)retorne novoInicio
}
04/11/23 EDA - Prof. Paulemir Campos 25
Filas: Alocação Dinâmica
Acessando elementos da fila
Como estamos usando uma lista simplesmente encadeada podemos acessar todos os elementos da fila, apartir do inicio, fazendo pequenos ajustes na função de acesso aos elementos de uma lista simplesmente encadeada para usar com o tipo fila.
04/11/23 EDA - Prof. Paulemir Campos 26
Szwarcfiter, J. L.; Markenzon, L. Estruturas de Dados e seus Algoritmos. Rio de Janeiro: LTC, 2a. ed., 1994.
Veloso, P. et al. Estrutura de Dados. Rio de Janeiro: Editora Campus, 1996.
Referências