Para manipular uma pilha implementada sobre um arranjo é necessário que se conheça três valores:
o índice do arranjo a partir do qual a pilha pode ser implementada, geral- ■
mente denominado de Base da pilha;
o índice ocupado pelo elemento que está no
■ Topo da pilha, e que é o úni-
co elemento que pode ser manipulado; e
o índice do último elemento do arranjo que poderá ser utilizado por esta ■
pilha, aqui denominado de Lim(limite da pilha).
Como exemplo de manipulação desta estrutura de dados, consideremos uma pilha implementada sobre um arranjo denominado PILHA, a partir do índice
“1”, com espaço para armazenar no máximo 6 nodos. Nessa pilha são arma- zenados valores inteiros. A seguinte seqüência de operações é apresentada graficamente na Figura 4.2:
1 inicializar a pilha – no exemplo, isto é indicado por Topo valendo 0 (figura
4.2a);
2 inserir um novo nodo com valor 3 (figura 4.2b);
LIM 6 5 4 3 2 1 PILHA (a) BASE TOPO = 0 3 LIM 6 5 4 3 2 1 PILHA (b) BASE TOPO 7 3 LIM 6 5 4 3 2 1 PILHA (c) BASE TOPO 5 7 3 LIM 6 5 4 3 2 1 PILHA (d) BASE TOPO 7 3 LIM 6 5 4 3 2 1 PILHA (e) BASE TOPO
Capítulo 4 Pilhas e Filas 129
3 inserir um novo nodo com valor 7 (figura 4.2c);
4 inserir um novo nodo com valor 5 (figura 4.2d);
5 remover um nodo (figura 4.2e).
Após a execução destas operações, caso a pilha fosse consultada, o valor retornado seria 7, uma vez que este é o valor do nodo que está no topo da
pilha.
A seguir são apresentados os algoritmos relativos às operações básicas sobre uma pilha, considerando este tipo de implementação. Será utilizado o seguin- te tipo de dado:
TipoPilha = arranjo [1.. N] de TipoNodo
A operação de destruição da pilha não será apresentada, uma vez que en- volve somente o espaço reservado para a pilha no arranjo, o que deve ser controlado diretamente pela aplicação.
criação da pilha
■
A criação de uma pilha resultará em uma pilha vazia, devolvendo ao usuário as informações necessárias para seu posterior acesso. Deverá ser utilizada alguma convenção para indicar que a pilha está vazia. Optamos pela seguinte estra- tégia: a indicação de que a pilha está vazia é feita quando o índice de topo da pilha estiver indicando uma unidade a menos do que o índice de sua base. Os algoritmos que manipulam a pilha (inserção, remoção e consulta) utilizam esta estratégia para reconhecer a pilha vazia. Caso outra forma de representa- ção da pilha vazia seja utilizada, os algoritmos deverão ser a ela adaptados. Assim, considerando a pilha implementada sobre o arranjo Pilhada Figura
4.2, as variáveis de controle da pilha são inicializadas em:
Base ← 1 Topo ← Base – 1 Lim ← 6
A aplicação deve conhecer os limites do arranjo reservados para a pilha (Base
e Lim). Um algoritmo que inicializa uma pilha através da estratégia acima
citada deve receber, da aplicação, o índice da base da pilha, inicializando o
Algoritmo 4.1 – InicializarPilhaArr
Entrada: Base (inteiro) Saída: Topo (inteiro)
início
Topo ← Base – 1 fim
inserção de um nodo na pilha
■
Um novo nodo só pode ser inserido no topo da pilha, ou seja, logo acima da posição ocupada pelo topo da pilha. Esta operação é também conhecida como operação PUSH. Para que isso seja possível, é necessário que haja espaço
para este novo nodo no espaço reservado para a pilha sobre o arranjo, o que é informado pelo valor do limite da pilha, Lim. Caso a inserção seja realizada,
o valor do topo da pilha é incrementado, sendo este agora o nodo do topo e, conseqüentemente, o único ao qual se tem acesso.
O algoritmo apresentado a seguir insere um novo nodo no topo da pilha. Inicia verificando se há espaço no arranjo para a inserção e, em caso de haver espaço, passa o Topo para a próxima posição do arranjo, inserindo o valor
recebido (Valor) nesta posição. O parâmetro Sucesso retorna falso no caso
de não haver mais espaço para inserir um novo nodo.
Algoritmo 4.2 – InserirPilhaArr
Entradas: Pilha (TipoPilha)
Lim (inteiro) Topo (inteiro)
Valor (TipoNodo)
Saídas: Pilha (TipoPilha)
Topo (inteiro) Sucesso (lógico) início se Topo < Lim então início Topo ← Topo + 1 Pilha[Topo] ← Valor Sucesso ← verdadeiro fim
senão Sucesso ← falso fim
Capítulo 4 Pilhas e Filas 131
remoção de um nodo da pilha
■
Somente o nodo do topo de uma pilha pode ser removido. Esta operação, denominada simplesmente de remoção da pilha, é também conhecida por operaçãoPOP. A operação pode ser realizada se a pilha apresentar pelo menos um nodo, diminuindo o valor do índice do seu topo.
No algoritmo apresentado a seguir é removido o nodo do topo da pilha. Se a pilha estiver vazia no início da operação, Sucesso retorna falso. Como muitas
vezes o nodo removido é utilizado pela aplicação, este algoritmo também retorna o valor do nodo que foi removido no parâmetro ValorRemovido. Algoritmo 4.3 – RemoverPilhaArr
Entradas: Pilha (TipoPilha)
Topo (inteiro) Base (inteiro)
Saídas: Pilha (TipoPilha)
Topo (inteiro) Sucesso (lógico) ValorRemovido (TipoNodo) início se Topo ≥ Base então início ValorRemovido ← Pilha[Topo] Topo ← Topo – 1 Sucesso ← verdadeiro fim
senão Sucesso ← falso fim
acesso à pilha
■
Consultas e/ou alterações somente podem ser realizadas sobre o nodo que está no topo da pilha. Para acessar algum outro nodo da pilha é necessário antes remover os nodos que estão acima dele, a partir dos que estão no topo da pilha.
A seguir é apresentado um algoritmo que consulta o nodo do topo da pilha, devolvendo seu valor através do parâmetro Valor. Caso a pilha esteja vazia,
ser realizada. Como esta operação somente consulta o nodo do topo da pilha sem removê-lo, não são alterados os valores do arranjo que implementa a pilha, nem suas variáveis de controle (Base,TopoeLim).
Algoritmo 4.4 – ConsultarPilhaArr
Entradas: Pilha (TipoPilha)
Base (inteiro) Topo (inteiro)
Saídas: Valor (TipoNodo)
Sucesso(lógico) início se Topo ≥ Base então início Valor ← Pilha[Topo] Sucesso ← verdadeiro fim
senão Sucesso ← falso fim