You are on page 1of 7

Estrutura de Dados – Básica

Professor: Osvaldo Kotaro Takai.

Aula 8: Pilhas com Alocação de Memória Estática


O objetivo desta aula é apresentar estrutura de dados Pilha e suas aplicações.

Introdução
Embora algumas vezes a palavra “pilha” seja popularmente utilizada para representar um
amontoado de coisas sem nenhuma organização, como exemplifica a frase abaixo; em
Estrutura de Dados, esta palavra identifica um conjunto de dados organizados
sequencialmente e que são acessados segundo um critério bem definido. Esse critério de
acesso é denominado LIFO (Last-In, First-Out – O último a entrar é o primeiro a sair).

“Os três sujeitos que ali estavam em trempe, no centro da pilha de gente,
eram tidos e havidos pelo bom povo fluminense como as três grandes
luminárias da época.” (O Garatuja, José de Alencar, 1873).

Motivação

Um entregador de pizzas (motoboy) experiente provavelmente organizará as pizzas de acordo


com a sua rota de entrega. Suponha que ele tenha que entregar 4 pizzas para 4 clientes
diferentes de acordo com a seguinte rota:

Rota de Entrega:
1ª parada: Portuguesa
2ª parada: Margueritta
3ª parada: 4 Queijos
4ª parada: Lombo Catupiry

Assim, a primeira pizza que o motoboy irá colocar no bagageiro de sua moto é o de Lombo
Catupiry; a segunda será a de 4 Queijos; a terceira a Margueritta, e a última a Portuguesa.

4ª pizza colocada Æ Portuguesa Topo


3ª pizza colocada Æ Margueritta
2ª pizza colocada Æ 4 Queijos
1ª pizza colocada Æ Lombo Catupiry

Pilha de Pizzas

Em sua primeira parada, o motoboy entregará a pizza que está no topo da pilha (Portuguesa),
deixando a configuração da Pilha de Pizzas da seguinte forma:

1
3ª pizza colocada Æ Margueritta Topo
2ª pizza colocada Æ 4 Queijos
1ª pizza colocada Æ Lombo Catupiry

Pilha de Pizzas

Na segunda parada, o motoboy irá, novamente, entregar a pizza que está no topo da pilha,
agora a pizza Margueritta. Esse processo irá se repetir até a pilha ficar vazia.

Observações:
• A ordem das pizzas é importante.
• A última pizza a entrar na pilha foi a primeira a sair (LIFO: Last-in, First-Out).

Como neste exemplo, existem vários outros problemas do mundo real que se utiliza de pilhas.
A solução para esse tipo de problema muitas vezes imita esse mesmo comportamento; pois
quanto mais próximo for o modelo de sua realidade, mais fácil será a solução computacional.

Definição do Tipo Abstrato de Dados Pilha


Uma TAD Pilha é um conjunto de n elementos (ou nós): x0, x1, ..., xn-1, cuja propriedade
estrutural envolve as posições relativas de seus nós. Supondo n > 0, temos que:
1. X0 é o primeiro nó.
2. para 0 < k < n, xk é precedido por xk−1 e seguido por xk+1
3. xn-1 é o último nó e topo = n – 1.
4. topo = -1 indica que a Pilha está vazia.
5. Algumas operações possíveis:
a. Criar Pilha vazia.
b. Destruir Pilha.
c. Esvaziar Pilha.
d. Verificar se a Pilha está vazia.
e. Verificar se a Pilha está cheia.
f. Retornar tamanho da Pilha.
g. Retornar nó do topo.
h. Empilhar.
i. Desempilhar.

Implementação estática do TAD Pilha em C++


O TAD Pilha será implementado utilizando variáveis estáticas, no caso um vetor. A sua
implementação dinâmica será estudada na aula 10.

A implementação do TAD Pilha, descrita abaixo em linguagem C++, foi dividida em dois
arquivos. O primeiro, main.cpp, utiliza o TAD Pilha, criando duas pilhas p e p1 de duas formas
diferentes, empilha (push) e desempilha (pop) alguns valores e, no final, tenta desempilhar um
nó de uma pilha vazia. Naturalmente, isso irá gerar um erro conhecido como underflow de
pilha. Por outro lado, o TAD Pilha também está preparado para gerar um erro quando se tenta
empilhar mais do que o tamanho possível. Tal erro é conhecido como overflow de pilha.

O segundo arquivo, pilha.h, contém a implementação do TAD Pilha.

As explicações dos exemplos a seguir serão realizadas durante as aulas práticas em


laboratório.

2
Arquivo 1: main.cpp

3
Arquivo 2: pilha.h

4
TAD Pilha como uma classe genérica
A implementação acima permite empilhar números do tipo int. Se precisássemos empilhar, por
exemplo, float, char ou strict cliente, teríamos que criar um TAD Pilha para cada um desses
tipos, embora a estrutura do programa seja idêntica. Para solucionar esse problema, a
linguagem C++ permite passar um tipo de dados como parâmetro da classe. Assim, quando
fôssemos criar uma nova pilha, poderíamos indicar o tipo de dados dos nós como parâmetro.
Uma classe definida dessa forma é conhecida como classe parametrizada ou classe genérica.

Arquivo 1: main.cpp

5
Arquivo 2: pilhaGenerica.h

6
Preparação para os exercícios
Notações de expressões aritméticas

• Notação completamente Parentizada: acrescenta-se sempre um par de parênteses a


cada par de operandos e seu operador.
Exemplo:
tradicional: A * B – C / D
parentizada: ((A*B) – (C/D))
• Notação Polonesa: os operandos aparecem imediatamente antes dos operandos.
Esta notação especifica quais operadores, e em que ordem, devem ser calculados. Por
esse motivo dispensa o uso de parênteses, sem ambiguidades.
Exemplo:
tradicional: A * B – C / D
polonesa: – * A B / C D
• Notação Polonesa Reversa (ou posfix): é como a polonesa na qual os operandos
aparecem após os operandos.
Exemplo:
tradicional: A * B – C / D
polonesa reversa: A B * C D / –

Exercícios
1. Incremente os programas main.cpp dos exemplos apresentados, de forma a verificar
se todas as operações do TAD Pilha estão funcionando corretamente. Caso necessário
utilize o recurso de depuração (debug) do IDE Dev-C++.
2. Escreva um programa que verifique se as expressões aritméticas estão com a
parentização correta. Seu programa deve checar expressões para ver se cada "abre
parênteses" tem um "fecha parênteses" correspondente.
3. Escreva um programa que converta uma expressão escrita na notação parentizada no
seu equivalente na notação polonesa reversa.
4. Escreva um programa que dada uma expressão aritmética tradicional, avalie seu valor.
Por exemplo, 3+4*(4/2), deverá gerar como resultado: 11.

You might also like