Pilhas Profa Morganna Diniz
Pilhas Geralmente pilhas são úteis em situações em que dados devem ser recuperados em ordem inversa a do armazenamento É uma estrutura de dados linear que permite acesso por uma das suas extremidades Exemplo Pilha de pratos 2
Pilhas As principais características de uma pilha são o acesso aos elementos é realizado em uma única ponta, o topo da pilha elementos são adicionados ou removidos do topo da pilha a ação de adicionar um elemento na pilha é chamada de empilhar ou, em inglês, to push a ação de remover um elemento da pilha é chamada de desempilhar ou, em inglês, to pop Pilhas utilizam o critério de acesso critério LIFO (último a entrar é o primeiro a sair) 3
Pilhas O exemplo de utilização de pilha mais próximo é a própria pilha de execução da linguagem C As variáveis locais das funções são dispostas numa pilha e uma função só tem acesso às variáveis que estão no topo não é possível acessar as variáveis da função locais às outras funções 4
Pilhas Alternativas de implementação usando um vetor usando uma lista encadeada 5
Pilhas Independente da estratégia de implementação, podemos definir as operações que estarão disponibilizadas para manipular e acessar as informações da pilha 1. criar uma pilha; 2. inserir um elemento no topo (push); 3. remover o elemento do topo (pop); 4. verificar se a pilha está vazia; 5. liberar a estrutura de pilha 6
Implementação de pilhas com vetor Implementação de pilha com vetor vetor (vet) armazena os elementos da pilha elementos inseridos ocupam as primeiras posições do vetor variável topo indica o índice do elemento corrente elemento vet[ topo ] representa o elemento do topo 7
Implementação de pilhas com vetor Algoritmo para empilhar elementos se a pilha não está cheia então incrementa de 1 variável topo coloca elemento na posição vet[ topo ] se a pilha está cheia então exibe mensagem Algoritmo para desempilhar elementos se a pilha não está vazia então recupera elemento do vetor da posição topo decrementa índice topo de uma unidade se a pilha está vazia então exibe mensagem 8
Implementação de pilhas com vetor Em um vetor com n elementos tamanho máximo indicado no início Os elementos são indexados da posição zero até a posição n -1 Como verificar se a pilha está cheia? topo = n 1 Como verificar se a pilha está vazia? Qual o valor para inicializar a variável topo? topo = -1 9
Implementação de pilhas com vetor Classe pilhachar para pilha de caracteres Atributos tamanho n índice elemento corrente topo os elementos do vetor pilha vet Ações empilhar (push) / desempilhar (pop) verificar se está cheia / verificar se está vazia Para permitir tamanho variável vetor alocado dinamicamente no construtor pode ter um tamanho default 10
Primeiro exemplo de pilhas Algoritmo para inverter uma cadeia de caracteres se caracteres estão armazenados em um vetor, uma solução simples poderia ser localizar o fim do vetor listar os caracteres daquele ponto até o início do vetor utilizando um laço (comando for) entretanto, suponha que você desconheça, de ante mão, o tamanho da cadeia de caracteres por exemplo, quando você lê os caracteres, um a um, via teclado ou de um arquivo a seguir, um algoritmo simples para inverter tal cadeia 11
Primeiro exemplo de pilhas Algoritmo para inverter uma cadeia de caracteres 1. leia um caractere 2. coloque o caractere no topo de qualquer outro caractere lido 3. repita os passos 1 e 2 até não existirem mais caracteres a serem lidos 4. remova o caractere do topo da pilha que foi criada na primeira parte do algoritmo 5. imprima o caractere a direita de qualquer outro caractere previamente impresso 6. repita os passos 4 e 5 até não existirem mais caracteres na pilha 12
Pilhas #ifndef PILHACHAR_H #define PILHACHAR_H #include <iostream> #include <cstdlib> class pilhachar{ protected: int n; char *vet; int topo; public: bool vazia() const; bool cheia() const; pilhachar(int tamanho = 10); ~pilhachar(); bool pop(char& elemento); bool push(const char& elemento); bool pilha_topo (char& elemento); ; #endif 13
main.cpp (1/2) #include "pilhachar.h" using namespace std; int main() { pilhachar Pilha(20); char c; cout << "Entre com uma frase: "; cin.get(c); while ( c!= '\n') { Pilha.push(c); cin.get(c); 14
main.cpp (2/2) cout << "Frase invertida: "; while (!Pilha.vazia()) { Pilha.pop(c); cout << c; cout << endl; system("pause"); return 0; 15
Referências Este material foi produzido baseado no material do curso de ED1 oferecido pelo Prof. Ângelo Ciarlini e disponível em http://www.uniriotec.br/~angelo.ciarlini/edd1/material_di datico.htm 16
pilhachar.cpp (1/5) #include "pilhachar.h" using namespace std; pilhachar::pilhachar(int tamanho) : n(tamanho), vet(new char[tamanho]), topo(-1) { pilhachar::~pilhachar() { delete [] vet; 17
pilhachar.cpp (2/5) bool pilhachar::vazia() const { return topo == -1? true : false; bool pilhachar::cheia() const { return topo == n - 1? true: false; 18
pilhachar.cpp (3/5) bool pilhachar::pop(char& elemento) { if (!vazia()) { elemento = vet[topo--]; return true; else { cout << "Pilha vazia: pop nao funcionou.\n"; return false; 19
pilhachar.cpp (4/5) bool pilhachar::push(const char& elemento) { if (!cheia()) { vet[++topo] = elemento; return true; else { cout << "Pilha cheia: push nao funcionou.\n"; return false; 20
pilhachar.cpp (5/5) bool pilhachar::pilha_topo(char& elemento) { if(!vazia()){ elemento = vet[topo]; return true; else return false; 21