aula 11 pilha dinâmica prof leticia winkler - lncc.brlncc.br/~rogerio/ed/11 - pilha...

16
Aula 11 Pilha Dinâmica prof Leticia Winkler 1

Upload: dothien

Post on 08-Dec-2018

232 views

Category:

Documents


0 download

TRANSCRIPT

Aula 11

Pilha Dinâmica

prof Leticia Winkler

1

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) Consiste em remover um valor do topo da pilha.

Prof. Leticia Winkler

Topo

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

Código para Mostrar o topo // verifica se a pilha está vazia

if (topo == NULL) {

cout << "\n\nPilha vazia!!!\n\n";

}

else {

// mostra os dados do topo

cout << "\n\nTopo: " << topo->dado << endl;

}

Prof. Leticia Winkler 16