7. Pilha 7.1 Fundamentos Uma pilha é um tipo especial de lista linear em que todas as operações de inserção e remoção sã realizadas em uma mesma extremidade chamada topo. Devido a esta disciplina de acesso, os elementos são sempre removidos inversa àquela em que forma inseridos, de modo que o último elemento que entra é o primeiro que sai. Esta listas são denominadas LIFO (Last In First Out) 7.2 Exemplos de aplicação de pilhas a) mostre a representação de um número decimal no sistema binário. Como isto poderia ser feito usando pilha? b) avaliação do uso correto de delimitadores em expressões matemáticas, por exemplo: a*(b+c) c) chamadas de subrotinas inicio sub A 60 call B 70 call C 80 imp TOT 90 fim sub A 100 sub-rotina A inicio 10 call A 20 imp QTD 30 fim 50 prog. principal 110 120 130 140 150 inicio sub B imp VAL call C imp DIF fim sub B inico sub C le SAL imp BRU imp LIQ fim sub C 160 170 180 190 200 sub-rotina B sub-rotina C Execução do programa principal 30 00 80 30 0 140 80 30 0 80 30 0 90 30 0 30 0 0 7.3 Descirção do TDA para uma pilha Descrevereomso um TDA para a pilha com as segintes operações: a. b. c. d. e. f. Inicializar_Pilha – coloca a pilha na condição de vazia Pilha_é_Vazia – verifica se a pilha está vazia Pilha_é_Cheia – verifica se a pilha está cheia Le_Topo – acessa o elemento do topo da pilha Empilhar_Elem – insere um elemento no topo da pilha Desempilhar_Elem – remove um elemento do topo da pilha TDA pilha é dado: números inteiros operações Inicializa_Pilha entrada: endereço da pilha pré-condição: nenhuma processo: colocar a pilha na condição de vazia saída: nenhuma pós-condição: pilha vazia é-vazia entrada: endereço da pilha pré-condição: nenhuma processo: verifica se a pilha está na condição de vazia saída: retorna True se a pilha estiver vazia retorna False caso contrário pós-condição: nenhuma é-cheia entrada: endereço da pilha pré-condição: nenhuma processo: verifica se a pilha está cheia saída: retorna True se a pilha estiver cheia retorna False caso contrário pós-condição: nenhuma le_topo entrada: endereço da pilha e o endereço de retorno para o elemento que está no topo da pilha pré-condição: a pilha não ser vazia processo: le elemento que está no topo da pilha se alterar a indicação de topo de pilha saída: retorna 1 se sucesso retorna –1 se fracasso pós-condição: nenhuma empilha entrada: endereço da pilha e o elemento a ser empilhado pré-condição: a pilha não estar cheia processo: o elemento deve ser inserido no topo da pilha e o topo da pilha ser adequadamente atualizado saída: retorna 1 se sucesso retorna –1 se fracasso pós-condição: um elemento a mais na pilha desempilha entrada: endereço da pilha e o endereço de retorno do elemento pré-condição: a pilha não estar vazia processo: remover o elemento que está no topo da pilha e atualizar adequadamente a indicação de topo da pilha saída: retorna 1 se sucesso retorna –1 se fracasso pós-condição: um elemento a menos na pilha 7.4 Implementação de uma pilha usando alocação estática/sequencial a. estrutura da pilha define a estrutura pilha como um ponteiro para o topo um vetor com Max elementos fim; b. Inicializa_Pilha – esta função deve colocar a pilha na condição de vazia. Isto significa fazer o topo da pilha apontar para uma posição inválida. Como a alocação é estática podemos atribuir a topo o valor –1. Inicializa_Pilha( endereço da pilha) inicio atribui ao topo da pilha o valor –1; retorna da função; fim; c. Pilha_é_ Vazia- esta função retorna o valor verdadeiro ou falso dependendo se a pilha está vazia ou não. Pilha_é_Vazia( endereço da pilha) inicio se topo da pilha é –1 então a função retorna o valor True senão a função retorna o valor False; fim; d. Pilha_é_Cheia – esta função função retorna o valor verdadeiro ou falso dependendo se a pilha está cheia ou não. Pilha_é_Cheia( endereço da pilha) inicio se topo da pilha é igual ao tamanho do vetor que define a pilha menos 1 então a função retorna o valor True senão a função retorna o valor False fim; e. Empilha_Elem – esta função insere um novo elemento no topo da pilha. Para tanto o topo da pilha deve ser incrementado e o elemento inserido nesta posição. tipo Empilha_Elem( endereço da pilha, elemento a ser inserido) inicio se a pilha é cheia a função retorna o valor –1; incrementa o apontador para o topo da pilha; insere o elemento na pilha na posição topo; a função retorna o valor 1; fim; f. Desempilha_Elem – esta função remove o elemento que está no topo da pilha e decrementa o valor do apontador topo da pilha. tipo Desempilha_Elem( endereço da pilha, endereço de retorno do elemento a ser removido) inicio se a pilha é vazia então a função retorna o valor –1; atribui ao conteúdo do endereço de retorno o elemento que está no topo da pilha; decrementa o apontador para o topo da pilha; a função retorna o valor 1; fim; g. Le_Topo – esta função le o topo da pilha se alterar o apontador para o topo da pilha. tipo Le_Topo( endereço da pilha, endereço de retorno do elemento que está no topo da pilha) inicio se a pilha é vazia então a função retorna o valor –1; atribui ao conteúdo do endereço de retorno o elemento que está no topo da pilha; a função retorna o valor 1; fim;