aula t11 – bcc202 pilhas túlio toffolo decom.ufop.br/toffolo
DESCRIPTION
Aula T11 – BCC202 Pilhas Túlio Toffolo www.decom.ufop.br/toffolo. O que é uma pilha?. Pilha. 4. 4. 3. 3. 2. 1. 1. 2. O que é uma pilha?. Pilha. 4. 3. 2. 1. TAD Pilha. Tipo Abstrato de dados com a seguinte característica: - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/1.jpg)
Aula T11 – BCC202 Aula T11 – BCC202
PilhasPilhas
Túlio ToffoloTúlio Toffolowww.decom.ufop.br/toffolowww.decom.ufop.br/toffolo
![Page 2: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/2.jpg)
O que é uma pilha?
1
4
3
2
Pilha
1
4
3
2
![Page 3: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/3.jpg)
O que é uma pilha?
Pilha
1
4
3
2
![Page 4: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/4.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)
Analogia: pilha de pratos, livros, etc.
Usos: Chamada de subprogramas, avalição de expressões aritméticas, etc.
![Page 5: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/5.jpg)
TAD Pilha
Operações: 1. FPVazia(Pilha). Faz a pilha ficar vazia. 2. PEhVazia(Pilha). Retorna true se a pilha está vazia; caso
contrário, retorna false. 3. PEmpilha(Pilha, x). Insere o item x no topo da pilha. 4. PDesempilha(Pilha, x). Retorna o item x no topo da pilha,
retirando-o da pilha. 5. PTamanho(Pilha). Esta função retorna o número de itens da
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 as implementações por meio de arranjos e de apontadores
![Page 6: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/6.jpg)
Implementação de Pilhas através de Arranjos
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 7: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/7.jpg)
Estrutura de Dados de Pilha através de Arranjos
#define MaxTam 1000
typedef int Apontador;typedef int TChave;typedef struct { TChave Chave; /* outros componentes */} TItem;typedef struct { TItem vItem[MaxTam]; Apontador iTopo;} TPilha;
![Page 8: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/8.jpg)
Operações sobre Pilhas usando Arranjos
void FPVazia(TPilha* pPilha)
{
pPilha->iTopo = 0;
} /* FPVazia */
int PEhVazia(TPilha* pPilha)
{
return (pPilha->iTopo == 0);
} /* PEhVazia */
![Page 9: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/9.jpg)
Operações sobre Pilhas usando Arranjos
int PEmpilha(TPilha* pPilha,
TItem* pItem)
{
if (pPilha->iTopo == MaxTam)
return 0;
pPilha->vItem[pPilha->iTopo] = *pItem;
pPilha->iTopo++;
return 1;
} /* PEmpilha */
![Page 10: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/10.jpg)
Operações sobre Pilhas usando Arranjos
int PDesempilha(TPilha* pPilha, TItem* pItem){ if (PEhVazia(pPilha)) return 0;
pPilha->iTopo--; *pItem = pPilha->vItem[pPilha->iTopo]; return 1;} /* PDesempilha */
![Page 11: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/11.jpg)
Operações sobre Pilhas usando Arranjos
int PTamanho(TipoPilha* pPilha){ return (pPilha->iTopo);} /* Tamanho */
![Page 12: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/12.jpg)
Implementação de Pilhas por meio de Apontadores
Há uma célula cabeça no topo para facilitar a implementação das operações empilha e desempilha quando a pilha está vazia.
Para desempilhar o item xn basta desligar a célula cabeça da lista e a célula que contém xn passa a ser a célula cabeça.
Para empilhar um novo item, basta fazer a operação contrária, criando uma nova célula cabeça e colocando o novo item na antiga.
![Page 13: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/13.jpg)
Estrutura da Pilha Usando Apontadores
O 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 TPilha contém um apontador para o topo da pilha (célula cabeça) e um apontador para o fundo da pilha.
![Page 14: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/14.jpg)
Estrutura da Pilha Usando Apontadores
typedef int TChave;typedef struct { TChave Chave; /* --- outros componentes --- */} TItem;
typedef struct Celula* Apontador;typedef struct Celula { TItem Item; struct Celula* pProx; // Apontador pProx} TCelula;
typedef struct { Apontador pFundo; Apontador pTopo; int iTamanho;} TPilha;
![Page 15: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/15.jpg)
Operações sobre Pilhasusando Apontadores (com cabeça)
void FPVazia(TPilha* pPilha){ pPilha->pTopo = (Apontador)malloc(sizeof(TCelula)); pPilha->pFundo = pPilha->pTopo; pPilha->pTopo->pProx = NULL; pPilha->iTamanho = 0;} /* FPVazia */
int PEhVazia(TPilha* pPilha){ return (pPilha->pTopo == pPilha->pFundo);} /* PEhVazia */
![Page 16: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/16.jpg)
Operações sobre Pilhasusando Apontadores (sem cabeça)
void FPVazia(TPilha* pPilha){ pPilha->pTopo = NULL; pPilha->iTamanho = 0;} /* FPVazia */
int PEhVazia(TPilha* pPilha){ return (pPilha->pTopo == NULL);} /* PEhVazia */
![Page 17: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/17.jpg)
Operações sobre Pilhasusando Apontadores (com cabeça)
int PEmpilha(TPilha* pPilha, TItem* pItem){ Apontador pNovo; pNovo = (Apontador) malloc(sizeof(TCelula));
if (pNovo == NULL) return 0;
pPilha->pTopo->Item = *pItem; pNovo->pProx = pPilha->pTopo; pPilha->pTopo = pNovo; pPilha->iTamanho++; return 1;} /* PEmpilha */
![Page 18: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/18.jpg)
Operações sobre Pilhasusando Apontadores (sem cabeça)
int PEmpilha(TPilha* pPilha, TItem* pItem){ Apontador pNovo; pNovo = (Apontador) malloc(sizeof(TCelula));
if (pNovo == NULL) return 0; pNovo->Item = *pItem; pNovo->pProx = pPilha->pTopo; pPilha->pTopo = pNovo; pPilha->iTamanho++; return 1;} /* PEmpilha */
![Page 19: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/19.jpg)
Operações sobre Pilhasusando Apontadores (com cabeça)
int PDesempilha(TPilha* pPilha, TItem* pItem){ Apontador pAux; /* celula a ser removida */ if (PEhVazia(pPilha)) return 0;
pAux = pPilha->pTopo; pPilha->pTopo = pAux->pProx; *pItem = pAux->pProx->Item; free(pAux); pPilha->iTamanho--; return 1;} /* PDesempilha */
![Page 20: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/20.jpg)
Operações sobre Pilhasusando Apontadores (sem cabeça)
int PDesempilha(TPilha* pPilha, TItem* pItem){ Apontador pAux; /* celula a ser removida */ if (PEhVazia(pPilha)) return 0;
pAux = pPilha->pTopo; pPilha->pTopo = pAux->pProx; *pItem = pAux->Item; free(pAux); pPilha->iTamanho--; return 1;} /* PDesempilha */
![Page 21: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/21.jpg)
Operações sobre Pilhasusando Apontadores (sem e com
cabeça)int PTamanho(TipoPilha* pPilha){ return (pPilha->iTamanho);} /* PTamanho */
![Page 22: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/22.jpg)
Exercício
Seja TLista o TAD Lista que implementa as seguintes funções: void FLVazia(TLista* pLista)
(faz com que a lista fique vazia) int LEhVazia(TLista* pLista)
(verifica se a lista é vazia) void LInsere(TLista *pLista,TItem* pItem)
(insere pItem na última posição da lista) int LRetira(TLista* pLista, TItem* pItem)
(retira o último item da lista e retorna em pItem) Implemente a TAD TPilha utilizando TLista
![Page 23: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/23.jpg)
Exemplo de Uso Pilhas 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 Pilha definido anteriormente, implementado por meio de arranjo.
![Page 24: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/24.jpg)
Exemplo de Uso Pilhas 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. Ex: DECOM*UFOP*! DECOM UFOP.
![Page 25: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/25.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 26: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/26.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 27: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/27.jpg)
ET - Implementação
int main(int argc, char* argv[]){ TPilha Pilha; TItem x; FPVazia(&Pilha); x.Chave = getchar(); while (x.Chave != MarcaEof) { if (x.Chave == CancelaCaractere) { if (!PEhVazia(&Pilha)) PDesempilha(&Pilha, &x); } else if (x.Chave == CancelaLinha) FPVazia(&Pilha); else if (x.Chave == SaltaLinha) PImprime(&Pilha); else if (PTamanho(Pilha) == MaxTam) PImprime(&Pilha); else PEmpilha(&Pilha, &x); x.Chave = getchar(); } if (!PEhVazia(&Pilha)) PImprime(&Pilha); return 0;} /* main */
![Page 28: Aula T11 – BCC202 Pilhas Túlio Toffolo decom.ufop.br/toffolo](https://reader036.vdocuments.pub/reader036/viewer/2022062518/5681407f550346895dac030a/html5/thumbnails/28.jpg)
ET - Implementaçãovoid PImprime(TipoPilha* pPilha){ TipoPilha Pilhaux; TipoItem x; FPVazia(&Pilhaux); while (!PEhVazia(pPilha)) { PDesempilha(pPilha, &x); PEmpilha(&Pilhaux,&x); } while (!PEhVazia(&Pilhaux)) { PDesempilha(&Pilhaux, &x); putchar(x.Chave); } putchar('\n');} /* Imprime */