EAD PILHA - DEFINIÇÃO Os seus elementos são processados pela ordem inversa à ordem de chegada: - o último elemento a entrar na Pilha é o primeiro a sair (LIFO Last In First Out ). Qualquer operação que se pretenda efetuar será realizada no topo da Pilha Elem3 Topo Elem2 Elem1 Inserção de um novo elemento na pilha consiste em - acrescentar este elemento no topo da pilha; Remoção de um elemento da pilha - só é possível realizar-se se a pilha não estiver vazia, - consiste em retirar o elemento que se encontra no topo da pilha, - passa o elemento que está a seguir ao topo, caso exista, a ser o topo de pilha. Pilha vazia - acontece quando é removido o último elemento da pilha, - apenas é possível realizar operações de inserção de elementos na pilha. 1
EAD Pilha - Definição axiomática Estrutura Pilha (Elemento) CriarPilha (Elemento) Pilha PilhaVazia (Pilha) 1 (verdadeiro) ou 0 (falso) Push (Elemento, Pilha) Pilha Pop (Pilha) Pilha TopoPilha (Pilha) Elemento tais que S Pilha, Elem Elemento sejam PilhaVazia(Criar(Elem)) = 0 (falso) PilhaVazia(Push(Elem, S)) = 0 (falso) Pop(CriarPilha(Elem)) = (pilha vazia) Pop(Push(Elem, S)) = S Pop(S) = Se PilhaVazia(S) Então ERRO Senão S - TopoPilha(S) TopoPilha(Criar(Elem)) = Elem TopoPilha(Push(Elem, S)) = Elem TopoPilha(S) = Se PilhaVazia(S) Então ERRO Senão TopoPilha(S) Fim Pilha 2
EAD Pilha - Operações básicas - Criar uma Pilha (com um Elemento): CriarPilha (Elemento) - Verificar se uma Pilha está vazia: PilhaVazia (Pilha) - Inserir um Elemento numa Pilha: Push (Elemento, Pilha) - Remover elemento de uma Pilha: Pop (Pilha) - Consultar uma Pilha: TopoPilha (Pilha). EAD Pilha - Implementação usando listas - Armazenamento - sequencial (usando vetores), ou - não sequencial (usando listas ligadas). - Neste documento, a implementação é através de listas ligadas simples, as quais são simuladas com vetores. - Implementação usando listas ligadas simples: - apenas se utiliza um ponteiro associado ao topo da pilha, - este ponteiro é o índice do nodo do vetor que contém o elemento do topo da pilha. 3
EAD PILHA - ARMAZENAMENTO NÃO SEQUENCIAL COM VETORES Indicador de topo da pilha - índice do nodo com o elemento mais recente da pilha, - será o primeiro a ser removido, - quando nulo (0) significa que a pilha está vazia. Uma pilha nunca está cheia, - pode é não haver memória suficiente para guardar um novo elemento 4
Estrutura de dados: - Pilha é um vetor em que cada componente (nodo) é composto por 2 campos: - Elemento (informação a tratar), que pode ser um tipo de dados - não estruturado básico (inteiro, real, caracter,...), ou - estruturado (vetor, matriz, registo,...); se o tipo de dados é um registo, então é composto por um ou mais subcampos (dependendo do volume de informação a tratar) em que um deles pode funcionar como Chave; - Prox, é um número inteiro associado ao índice do nodo que o segue na pilha (o sucessor); - Topo (índice do nodo do vetor associado ao topo da pilha) - Representação de um nodo da pilha: Nodo Elemento Prox Informação Sucessor 5
Exemplo: Pilha em que o elemento de cada nodo é um inteiro. Representação gráfica: Topo 16 29 14 18 36 23 Estrutura de dados: Pilha(k) = struct { Elemento, Prox }, k = 1,... Pilha é um tipo de dados estruturado, mais especificamente um registo (estrutura); Elemento é um tipo de dados não estruturado básico (inteiro). Topo = 3 Pilha 1 2 3 4 5 6 Elemento 29 23 16 14 36 18 Prox 4 0 1 6 2 5 Implementação em MatLab: TopoPilha(Pilha) = 16 6
Operações auxiliares sobre uma EAD Pilha: - Criar um nodo de uma Pilha [CriarNodo - EAD Lista] - Determinar o tamanho de uma Pilha [TamanhoLista - EAD Lista] - Libertar/destruir um nodo de uma Pilha [LibertarNodoLista - EAD Lista] Operações básicas sobre uma EAD Pilha: - Criar uma Pilha (com um elemento) [CriarLista - EAD Lista] - Verificar se uma Pilha está vazia [ListaVazia - EAD Lista] - Inserir um novo elemento numa Pilha (no topo) [InserirInicioLista - EAD Lista] - Remover um elemento de uma Pilha (o do topo) [remoção específica] - Consultar um elemento de uma Pilha (o do topo) [consulta específica] Operações específicas sobre os elementos de uma Fila: - Criar um elemento de uma Pilha (CriarElemento - Exemplos de EAD Lista) - Mostrar um elemento de uma Pilha (MostrarElemento - Exemplos de EAD Lista) 7
Criar um nodo de uma Pilha a partir de um elemento Nota: - operação usada para criar um nodo com um elemento para posterior inserção numa pilha - função igual a "CriarNodo" da EAD Lista Parâmetros: Entrada: informação referente a um elemento (Elem) Saída: um nodo isolado composto pelo elemento fornecido e sem sucessor (Nodo) Função implementada em MatLab (iterativa): function [Nodo] = CriarNodo (Elem) Nodo.Elemento = Elem; Nodo.Prox = 0; 8
Determinar o tamanho de uma pilha Notas: - operação para determinar o número de elementos da pilha, o qual é usado na operação para inserir um elemento numa pilha, para atualizar o tamanho do vetor da pilha - função igual a "TamanhoLista" da EAD Lista Parâmetros: Entrada: pilha (Pilha) e topo da pilha (Topo) Saída: tamanho (quantidade de elementos) da pilha (tampilha) Função implementada em MatLab: function [tampilha] = TamanhoPilha (Pilha, Topo) k = Topo; tampilha = 0; while k ~= 0 tampilha = tampilha + 1; k = Pilha(k).Prox; end; 9
Libertar um nodo de uma Pilha Notas: - operação usada para libertar um nodo do vetor da pilha, após remoção da pilha - função igual a "LibertarNodoLista" da EAD Lista Parâmetros: Entrada: pilha (Pilha) e topo da pilha (Topo) Saída: vetor da pilha sem o nodo libertado (Pilha) e topo da pilha atualizado (Topo) Função implementada em MatLab: Nota: TamanhoPilha é uma operação auxiliar da EAD Pilha function [Pilha, Topo] = LibertarNodoPilha (Pilha, Topo) tam = TamanhoPilha(Pilha, Topo); % determinar o número de elementos da pilha if tam == 0 return; end; % determinar o nodo a libertar (indnodo), que tem no seu campo Prox o valor -1 indnodo = 1; while indnodo <= tam & Pilha(indNodo).Prox ~= -1 indnodo = indnodo + 1; end; 10
if indnodo > tam % se o índice do nodo a libertar é o último do vetor Pilha(indNodo) = []; return; % então não existe nodo a libertar ou está no fim do vetor end; % a pilha tem um elemento a menos, mas o vetor da pilha mantém o nodo; % assim, este nodo deve ser libertado/retirado do vetor (isto é, eliminado) % primeiro: eliminar o nodo de posição indnodo do vetor Pilha(indNodo) = []; % segundo: atualizar os campos Prox dos nodos com valores maiores do que indnodo for i = 1:tam if Pilha(i).Prox > indnodo Pilha(i).Prox = Pilha(i).Prox - 1; end; end; % terceiro: atualizar o topo da pilha, Topo, se for um índice superior a indnodo if Topo >= indnodo Topo = Topo - 1; end; 11
Criar uma Pilha (com um elemento) Nota: - função igual a "CriarLista" da EAD Lista Parâmetros: Entrada: informação relativa a um elemento (Elem) Saída: pilha com um nodo (Pilha) e topo da pilha (Topo) Função implementada em MatLab: Nota: CriarNodo é uma operação auxiliar da EAD Pilha function [Pilha, Topo] = CriarPilha (Elem) Nodo = CriarNodo(Elem); Pilha(1) = Nodo; Topo = 1; 12
Verificar se uma Pilha está vazia Notas: - uma pilha está vazia se o topo é 0 - função igual a "ListaVazia" da EAD Lista Parâmetros: Entrada: topo da pilha (Topo) Saída: 1 (se a pilha está vazia) ou 0 (se a pilha não está vazia) Função implementada em MatLab: function [vazia] = PilhaVazia (Topo) if Topo == 0 vazia = 1; else vazia = 0; end; 13
Inserir um elemento numa Pilha (Push) Nota: - função igual a "InserirInicioLista" da EAD Lista Parâmetros: Entrada: elemento a inserir (Elem), pilha (Pilha) e topo da pilha (Topo) Saída: pilha com mais um elemento (Pilha) e topo da pilha atualizado (Topo) Função implementada em MatLab: Nota: TamanhoPilha é uma operação auxiliar da EAD Pilha function [Pilha, Topo] = Push (Elem, Pilha, Topo) Novo = CriarNodo(Elem); % construir um nodo com os dados de Elem indnovo = TamanhoPilha(Pilha, Topo) + 1; % índice do novo nodo no vetor da pilha Pilha(indNovo) = Novo; % acrescentar o novo nodo ao vetor da pilha Pilha(indNovo).Prox = Topo; % ligar o novo nodo à pilha Topo = indnovo; % atualizar o topo da pilha 14
Remover um elemento de uma Pilha (Pop) Notas: - operação que só pode ser aplicada a uma pilha não vazia; caso contrário, ocorrerá ERRO - equivalente a remover o elemento de uma lista, o qual está no início da lista Parâmetros: Entrada: pilha (Pilha) e topo da pilha (Topo) Saída: pilha com menos um nodo (Pilha) e topo da pilha atualizado (Topo) Função implementada em MatLab: Nota: LibertarNodoPilha é uma operação auxiliar da EAD Pilha function [Pilha, Topo] = Pop (Pilha, Topo) % remover o elemento que está no topo da pilha indnodo = Topo; Topo = Pilha(Topo).Prox; Pilha(indNodo).Prox = -1; % isolar e marcar o nodo a libertar % libertar o nodo que (ainda) está no vetor da pilha [Pilha, Topo] = LibertarNodoPilha(Pilha, Topo); 15
Consultar uma Pilha (TopoPilha) Notas: - operação que só pode ser aplicada a uma pilha não vazia; caso contrário, ocorrerá ERRO - equivalente a consultar o elemento de uma lista que está no início da lista Parâmetros: Entrada: pilha (Pilha) e topo da pilha (Topo) Saída: mostra toda a informação sobre o elemento do topo da pilha Função implementada em MatLab: Nota: MostrarElemento é uma operação específica do problema function [] = TopoPilha (Pilha, Topo) MostrarElemento(Pilha(Topo).Elemento); 16
Exemplo: Pilha em que o elemento de cada nodo é um inteiro. Estrutura de dados: Pilha(k) = struct { Elemento, Prox }, k = 1,... Pilha é um tipo de dados estruturado (neste caso, do tipo registo); Elemento é um tipo não estruturado básico (neste caso, do tipo inteiro). Operações específicas deste problema a implementar (funções em MatLab): function [Elem] = CriarElemento () Elem = input('inserir um inteiro: '); function [] = MostrarElemento(Elem) disp(elem); 17