Pilha Dinâmica (Dynamic Stack) Pilha implementada através
de uma lista linear encadeada.
É uma lista linear encadeada em que as operações de inserção e retirada de um elemento é realizada em uma das extremidades da lista, chamada de topo.
O topo da pilha será o início da lista Empilhar = inserir antes do
primeiro da lista Desmpilhar = remover o
primeiro da lista
Prof. Leticia Winkler 2
Topo
Topo
Operações com uma Pilha Dinâmica Criação da pilha
Declarar o ponteiro para o topo da pilha
Inicialização da pilha determina o status inicial da pilha, a fim de prepará-la para a
inserção de dados. Ponteiro para o topo é NULL – aponta para nada
Empilhamento consiste em inserir um valor no topo da pilha (início da lista).
Verificar se a pilha está vazia Caracterizada pelo ponteiro para topo estar com NULL.
Desempilhamento consiste em retirar um valor do topo da pilha. É preciso verificar
previamente se a pilha está vazia.
Mostrar o topo
Prof. Leticia Winkler 3
Observações sobre Pilha Dinâmica Na pilha dinâmica não há necessidade de verificar se a pilha
está cheia, pois o limite na inserção de dados, está na capacidade do computador
Uma das vantagens da pilha dinâmica sobre a estática (sequencial – implementada com vetor) é não ter limite de sua capacidade. Outra vantagem: como os nós são alocados a medida que são necessários, a pilha dinâmica só usa o espaço realmente necessário.
O código das operções em pilha estática é mais simples que na dinâmica.
As aplicações para a pilha dinâmica são as mesmas da pilha estática.
Prof. Leticia Winkler 4
Criar a pilha Supondo a descrição de um nó:
struct no {
int dado;
struct no *prox;
};
Criar a pilha é declarar o ponteiro para o topo:
no *topo;
Prof. Leticia Winkler 5
Inicializar a Pilha Determina o status inicial da pilha, a fim de prepará-la
para a inserção de dados.
Inicialmente o ponteiro para o topo não aponta para nada:
topo = NULL;
Prof. Leticia Winkler 6
topo
Empilhar (Push) Consiste em inserir um valor no
topo da pilha.
Cria-se um novo nó
Novo nó aponta para o nó para o qual o topo aponta
topo aponta para o novo nó
Prof. Leticia Winkler 7
topo
topo
topo
novo
novo
Empilhar (Push) Cria-se um novo nó
Novo nó aponta para o nó para o qual o topo aponta
topo aponta para o novo nó
Prof. Leticia Winkler 8
topo
novo
topo
novo
topo
novo
Código para Empilhar // cria um novo no no *novo = new no; cout << "Valor? "; cin >> valor; novo->dado = valor; novo->prox = NULL; // inserindo no topo da pilha if (topo != NULL) { novo->prox = topo; } topo = novo;
Prof. Leticia Winkler 9
Verificar se a Pilha está Vazia A pilha estará vazia, quando o ponteiro para o topo
estiver apontando para nada (estiver aterrado)
Prof. Leticia Winkler 10
Código para Verificar se a Pilha está Vazia if (topo == NULL) {
cout << "\n\nPilha vazia!!!\n\n";
}
Prof. Leticia Winkler 11
Desempilhar (Pop) O ponteiro que indica o topo irá apontar para o
próximo do topo;
Antigo topo deve ser removido
Prof. Leticia Winkler 13
topo
Código para Desempilhar // testa se a pilha está vazia
if (topo == NULL) {
cout << "\nPilha vazia!!!\n\n";
}
else {
no *aux; // ponteiro auxiliar
aux = topo; // ponteiro auxiliar aponta para nó a ser removido
topo = topo->prox; // topo aponta para nó apontado pelo topo
cout << "\n\n" << aux->dado << " removido com sucesso\n";
delete aux; // libera a área de memória alocada pelo nó removido
}
Prof. Leticia Winkler 14
Mostrar o Topo Deve-se verificar se existem elementos na pilha (ou seja, se
a pilha não está vazia)
Numa pilha convencional só se pode vizualizar os dados do elemento que esta no topo (no exemplo o 10)
Prof. Leticia Winkler 15
10
30
20
topo