1/16
Estrutura Abstrata de Dados PILHA
Implementação com ligações simples
(com ponteiros e memória dinâmica)
Conceitos gerais 2/16
Conceitos gerais
Os seus elementos são processados pela ordem inversa à ordem de chegada
- o último elemento a entrar é o primeiro a sair (LIFO - “Last In First Out”) Qualquer operação que se pretenda efetuar será realizada no topo da Pilha
- Inserção de um novo elemento na pilha consiste em
- acrescentar este elemento ao cimo do topo da pilha
- Remoção de um elemento da pilha consiste em
- retirar o elemento que se encontra no topo da pilha
- passando o elemento que está antes, 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
Operações sobre uma Pilha 3/16
Operações sobre uma Pilha
Criar uma Pilha (vazia): criarPilha(S)
Verificar se uma Pilha está vazia: pilhaVazia(S)
Colocar um elemento X (no topo) de uma Pilha: push(X, S)
Remover um elemento (que está no topo) de uma Pilha: pop(S) Fornecer o elemento do topo de uma Pilha: topo(S)
Definição axiomática 4/16
Definição axiomática
Estrutura Pilha (INFOP) Declarar
criarPilha() ® Pilha
pilhaVazia(Pilha) ® 1 (verdadeiro) ou 0 (falso) push(INFOP, Pilha) ® Pilha
pop(Pilha) ® Pilha topo(Pilha) ® INFOP
tais que " S Î Pilha, " X Î INFOP, sejam
pilhaVazia(criarPilha()) = 1 (verdadeiro) pilhaVazia(push(X, S)) = 0 (falso)
pop(criarPilha()) = ERRO pop(push(X, S)) = S
topo(criarPilha()) = ERRO topo(push(X, S)) = X
Representação gráfica 5/16
Representação gráfica
EAD Pilha
Analogia
O identificador S
- é um ponteiro para o topo de uma pilha
Nodos e ligações 6/16
Nodos e ligações
Declaração
struct NodoPilha { INFOP Elemento;
struct NodoPilha *Ant;
}
typedef struct NodoPilha *PNodoPilha;
Cada nodo aponta para o nodo anterior da pilha O nodo do fundo da pilha aponta para NULL
A memória para os elementos (nodos) é
- atribuída quando um elemento é inserido na pilha - libertada quando um elemento é removido da pilha.
Pilha vazia: quando o topo da pilha é um ponteiro nulo (NULL)
Pilha cheia: quando não há memória para alocar um novo elemento
Operações sobre a estrutura INFOP 7/16
Operações sobre a estrutura INFOP
Mostrar no monitor os dados associados e um elemento do tipo INFOP void mostrarElementoP (INFOP X)
Criar um elemento do tipo INFOP INFOP criarElementoP ()
Comparar 2 elementos, X e Y, do tipo INFOP
int compararElementosP (INFOP X, INFOP Y)
devolve:
-1, se X < Y 0, se X = Y, e 1, se X > Y
Criar um nodo de uma Pilha 8/16
Criar um nodo de uma Pilha
Entrada: a informação propriamente dita (elemento X), que fará parte de um nodo Saída: um ponteiro para um nodo com informação (elemento X) e ligação a NULL
PNodoPilha criarNodoPilha (INFOP X) { PNodoPilha P;
P = (PNodoPilha) malloc (sizeof(struct NodoPilha));
if (P == NULL) return NULL;
P®Elemento = X;
P®Ant = NULL;
return P;
}
Libertar/destruir um nodo de uma Pilha 9/16
Libertar/destruir um nodo de uma Pilha
Entrada: um ponteiro para o nodo que se pretende destruir Saída: o ponteiro a apontar para NULL
PNodoPilha libertarNodoPilha (PNodoPilha P) { P®Ant = NULL;
free(P);
P = NULL;
return P;
}
Criar uma Pilha 10/16
Criar uma Pilha
Entrada: --
Saída: devolve uma Pilha S vazia (sem elementos)
PNodoPilha criarPilha () { PNodoPilha S;
S = NULL;
return S;
}
Verificar se uma Pilha está vazia 11/16
Verificar se uma Pilha está vazia
Entrada: uma Pilha S
Saída: 1 (se a Pilha S está vazia) ou 0 (se a Pilha S não está vazia)
int pilhaVazia (PNodoPilha S) { if (S == NULL)
return 1;
else
return 0;
}
Inserir elemento numa Pilha 12/16
Inserir elemento numa Pilha
Representação gráfica Inicial:
Final: S = push(X, S)
Inserir elemento numa Pilha 13/16
Função: insere um elemento no topo de uma Pilha (push) Entrada: um elemento X a inserir e uma Pilha S
Saída: a Pilha S atualizada (com mais um elemento)
PNodoPilha push (INFOP X, PNodoPilha S) { PNodoPilha Novo;
Novo = criarNodoPilha(X);
if (Novo == NULL) return S;
Novo®Ant = S;
S = Novo;
return S;
}
Remover elemento de uma Pilha 14/16
Remover elemento de uma Pilha
Representação gráfica Inicial:
Final: S = pop(S)
Remover elemento de uma Pilha 15/16
Função: remove o elemento do topo de uma Pilha (pop) Entrada: uma Pilha S
Saída: a Pilha S atualizada (sem o elemento do topo)
PNodoPilha pop (PNodoPilha S) { PNodoPilha P;
P = S;
S = S®Ant;
P = libertarNodoPilha(P);
return S;
}
Consultar elemento de uma Pilha 16/16
Consultar elemento de uma Pilha
Representação gráfica
topo(S) = 5 (S®Elemento)
Função: consulta o elemento do topo de uma Pilha (topo) Entrada: uma Pilha S
Saída: o elemento que está no topo da Pilha S (do tipo INFOP)
INFOP topo (PNodoPilha S) { return S®Elemento;
}