Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da...
Transcript of Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da...
![Page 1: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/1.jpg)
Pilhas Prof. Túlio Toffolo http://www.toffolo.com.br
BCC202 – Aula 11
Algoritmos e Estruturas de Dados I
![Page 2: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/2.jpg)
O que é uma pilha?
1
4
3
2
Pilha
1
4
3
2
![Page 3: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/3.jpg)
TAD Pilha
• Tipo Abstrato de dados com a seguinte característica:
• O último elemento a ser inserido é o primeiro a ser retirado/ removido
• (LIFO – Last in First Out)
• TAD conhecida como stack
• Analogia: pilha de pratos, livros, etc.
• Usos: Chamada de subprogramas, avalição de expressões aritméticas, etc.
![Page 4: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/4.jpg)
TAD Pilha
• Operações:
• 1. Pilha_Inicia(Pilha). Inicia uma pilha vazia.
• 2. Pilha_EhVazia(Pilha). Retorna 1 se a pilha está vazia; caso contrário, retorna 0.
• 3. Pilha_Push(Pilha, x). Empilha o item x no topo da pilha.
• 4. Pilha_Pop(Pilha, x). Desempilha o item x do topo da pilha, retirando-o da pilha.
• 5. Pilha_Tamanho(Pilha). Esta função retorna o número de itens da pilha.
![Page 5: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/5.jpg)
TAD Pilha
• Existem várias opções de estruturas de dados que podem ser usadas para representar pilhas.
• As duas representações mais utilizadas são:
• Por meio de arrays
• Por meio de ponteiros
5
![Page 6: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/6.jpg)
PILHAS POR MEIO DE ARRAYS
![Page 7: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/7.jpg)
Implementação de Pilhas por Arrays
• Os itens da pilha são armazenados em posições contíguas de memória.
• Como as inserções e as retiradas ocorrem no topo da pilha, um campo chamado topo é utilizado para controlar a posição do item no topo da pilha.
![Page 8: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/8.jpg)
PILHAS POR MEIO DE PONTEIROS
![Page 9: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/9.jpg)
Estrutura da Pilha por meio de Ponteiros
• Criar um campo tamanho evita a contagem do número de itens na função tamanho.
• Cada célula de uma pilha contém um item da pilha e um apontador para outra célula.
• O registro (struct) TPilha contém um apontador para o topo da pilha (célula cabeça) e um apontador para o fundo da pilha.
• Funcionam como início e fim de uma lista
![Page 10: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/10.jpg)
Cria Pilha Vazia (usando célula cabeça)
NULL
Cabeça
Fundo
NULL
10
![Page 11: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/11.jpg)
Inserção de Elementos na Pilha
• Opção única de posição onde pode inserir
• Topo da pilha (ou seja, primeira posição)
info
proxprox
info
prox
info
NULL
Fundo
11
![Page 12: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/12.jpg)
Inserção de um elemento da Pilha
info
proxprox
info
prox
info
NULL
Último
info
NULLprox
12
![Page 13: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/13.jpg)
Retirada de Elementos na Pilha
• Opção única de posição onde pode retirar
• Topo da pilha (ou seja, primeira posição)
info
proxprox
info
prox
info
NULL
Último
13
![Page 14: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/14.jpg)
Retirada de um elemento da Pilha
info
proxprox
info
prox
info
NULL
Último
14
![Page 15: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/15.jpg)
EXEMPLO DE USO DE PILHA
![Page 16: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/16.jpg)
Exemplo: Editor de Textos (ET)
• Vamos escrever um Editor de Texto (ET) que aceite os comandos:
• Cancela caracter
• Cancela linha
• Imprime linha
• O ET deverá ler um caractere de cada vez do texto de entrada e produzir a impressão linha a linha, cada linha contendo no máximo 70 caracteres de impressão.
• O ET deverá utilizar o tipo abstrato de dados TPilha definido anteriormente.
![Page 17: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/17.jpg)
Exemplo: Editor de Textos (ET)
• “#”: cancelar caractere anterior na linha sendo editada.
• Ex.: UFM##FOB#P DCC##ECOM!
• “\”: cancela todos os caracteres anteriores na linha sendo editada.
• “*”: salta a linha.
• “!”: Imprime os caracteres que pertencem à linha sendo editada, iniciando uma nova linha de impressão a partir do caractere imediatamente seguinte ao caractere salta-linha.
![Page 18: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/18.jpg)
Sugestão de Texto para Testar o ET
Este et# um teste para o ET, o extraterrestre em C.*Acabamos de testar a capacidade de o ET saltar de linha, utilizando seus poderes extras (cuidado, pois agora vamos estourar a capacidade máxima da linha de impressão, que é de 70 caracteres.)*O k#cut#rso dh#e Estruturas de Dados et# h#um cuu#rsh#o #x# x?*#?#+.* Como et# bom n#nt#ao### r#ess#tt#ar mb#aa#triz#cull#ado nn#x#ele\ Sera que este funciona\\\? O sinal? não### deve ficar!
![Page 19: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/19.jpg)
ET - Implementação
• Este programa utiliza um tipo abstrato de dados sem conhecer detalhes de sua implementação.
• A implementação do TAD Pilha que utiliza arranjo pode ser substituída pela implementação que utiliza apontadores sem causar impacto no programa
![Page 20: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/20.jpg)
int main(int argc, char* argv[]){ TPilha Pilha; TItem x; TPilha_Inicia(&Pilha); x.Chave = getchar(); while (x.Chave != MarcaEof) { if (x.Chave == CancelaCaractere) { if (!TPilha_EhVazia(&Pilha)) TPilha_Pop(&Pilha, &x); } else if (x.Chave == CancelaLinha) TPilha_Inicia(&Pilha); else if (x.Chave == SaltaLinha) TPilha_Imprime(&Pilha); else if (TPilha_Tamanho(Pilha) == MaxTam) TPilha_Imprime(&Pilha); else TPilha_Push(&Pilha, x); x.Chave = getchar(); } if (!TPilha_EhVazia(&Pilha)) TPilha_Imprime(&Pilha); return 0;}
ET - Implementação
![Page 21: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/21.jpg)
void PImprime(TipoPilha* pPilha){ TPilha Pilhaux; TItem x; TPilha_Inicia(&Pilhaux); while (!TPilha_EhVazia(pPilha)) { TPilha_Pop(pPilha, &x); TPilha_Push(&Pilhaux, x); } while (!TPilha_EhVazia(&Pilhaux)) { TPilha_Pop(&Pilhaux, &x); putchar(x.Chave); } putchar('\n');}
ET - Implementação
![Page 22: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/22.jpg)
Perguntas?
![Page 23: Pilhas - Universidade Federal de Ouro Preto · Implementação de Pilhas por Arrays • Os itens da pilha são armazenados em posições contíguas de memória. • Como as inserções](https://reader033.fdocumentos.tips/reader033/viewer/2022042612/5f6a03ab77534e2da235067c/html5/thumbnails/23.jpg)
Exercício
• Seja TLista o TAD Lista que implementa as seguintes funções:
• Suponha ainda que você tem conhecimento de que TLista é uma lista encadeada
• Implemente a TAD TPilha utilizando um TLista
void TLista_Inicia(TLista *pLista);int TLista_EhVazia(TLista *pLista);int TLista_InsereP(TLista *pLista, int p, TItem x);int TLista_RetiraP(TLista *pLista, int p, TItem *pX);int TLista_Tamanho(TLista *pLista);