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;