• Nenhum resultado encontrado

pilhas implementadas por contigüidade física

No documento Estruturas de dados_nodrm.pdf (páginas 129-133)

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

No documento Estruturas de dados_nodrm.pdf (páginas 129-133)