Professional Documents
Culture Documents
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
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.
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.
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.
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
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.