estrutura aula 2 - pilha e fila
DESCRIPTION
Entendendo Pilhas e FilasTRANSCRIPT
Estrutura da Informao
Pilha (LIFO) Aula 2
Uma pilha uma coleo ordenada de itens na qual os itens podem ser inseridos e retirados a partir da ltima posio, chamada topo da pilha. A Figura 1 representa uma estrutura do tipo pilha.
A definio de um TAD Pilha indica que apenas trs operaes podem ser realizadas: empilhamento, desempilhamento e uma eventual verificao do elemento que est no topo da pilha. A representao anterior ilustra uma pilha cujo contedo do topo o elemento E. Neste caso, quando um elemento inserido, ele inserido sobre E. A remoo de um elemento na pilha anterior eliminaria o elemento E da pilha.
Implementao de Pilha
Pode-se criar um TAD pilha utilizando a representao em array. A seguir descrita a implementao de uma pilha. A definio de uma estrutura para pilha necessita de apenas dois membros, um campo chamado topo e um campo onde as informaes so armazenadas representado por um array chamado dado. O campo topo do tipo inteiro e representa o ndice do topo na array.
Estrutura Pilha{
int topo = -1;
int dado[];
} p;
Inicialmente o ndice topo inicializado com 1. Isto indica que a pilha est vazia. Desta forma pode-se implementar um teste para verificar se a pilha est vazia (teste de underflow) da seguinte forma:
Se (topo == -1) ento
retorne pilha vazia
seno
retorne pilha no vazia
A operao de insero (empilhamento) pode ser facilmente implementada da seguinte forma:
empilha(p, 10) // Empilha o elemento 10 na pilha p
Se p no est cheia ento
topo = topo +1;
p.dado[topo] = 10
seno
Informe Pilha Cheia.
importante verificar a relizao do teste de overflow antes de efetivamente inserir o elemento na pilha. Este teste pode ser implementado da seguinte forma:
Se p.topo == tamanho de p.dado 1 ento
Retorne pilha cheia
Seno
Retorne Pilha no Cheia
A operao de remoo (desempilhamento) de um elemento tambm muito simples:
desempilha(p)// Desempilha o elemento da Pilha p
Se a p no est vazia ento
Retorne p.dado[topo]
topo = topo 1
Seno
Informe Pilha est vazia!
Exemplo 1
Um exemplo de utilizao de pilha consiste em avaliar uma expresso aritmtica segundo a utilizao dos parnteses (), colchetes [] e chaves {}. O problema consiste em criar uma pilha de caracteres. O programa recebe uma sequncia de caracteres que representa uma expresso aritmtica genrica, por exemplo: {A*(A+B)}. A expresso lida caracter a caracter da esquerda para direita. Quando um caracter de abertura encontrado (, [, ou { esse caracter empilhado. Quando um caracter de fechamento encontrado ),. ]ou } o elemento do topo da pilha comparado. Se o elemento do topo da pilha representa a abertura do respectivo fechamento, ento o elemento desempilhado. Quando o final da expresso obtido, se a pilha est vazia, ento a expresso est correta, caso contrrio a expresso est incorreta (Figura 2).
Fila (FIFO)
Uma fila uma coleo ordenada de itens na qual itens podem ser retirados pela posio frontal, chamada primeiro, e elementos podem ser inseridos na ultima posio, chamada ltimo.
Pode-se definir uma estrutura para representao de uma fila da seguinte forma:
Estrutura Fila{
int dado[];
int primeiro, ultimo;
} f;
Problemas com a representao de Filas em Array
Na implementao tradicional em array, a fila pode estar cheia mesmo apresentando posies livres;
Pode-se utilizar uma representao circular, mas as condies de fila cheia e vazia no so mais vlidas.
Exerccios
1. Dada uma determinada pilha p de nmeros inteiros inicialmente vazia, represente graficamente as operaes a seguir:
a) p.empilha(10)
b) p.empilha(-2)
c) p.empilha(16)
d) p.topo()
e) p.desempilha()
f) p.empilha(40)
g) p.desempilha();
h) p.desempilha();
i) p.desempilha();
j) p.empilha(35);
2. Simule a ao do algoritmo de verificao de (), {} e [] em nas expresses aritmticas a seguir e verifique o resultado da avaliao (se a expresso vlida ou no):
a) (A + B})
b) {[A + B] [(C - D)]
c) (A + B) {C + D} [F + G]
d) ((H) * {([J + K])})
e) (((A)))
Implementao de Pilha em Java (Aula Prtica da Semana)
public class Pilha
{
public int topo;
public int dado[];
public Pilha(int max)
{
topo = -1;
dado = new int[ max ];
}
public boolean cheia(){
return (topo == dado.length - 1) ? true : false;
}
public boolean vazia(){
return (topo == -1) ? true : false;
}
public void insere(int info)
{
if (cheia())
System.out.println("\nPilha Cheia");
else dado[++topo] = info;
}
public int retira(){
if (vazia()){
System.out.println("\nPilha Vazia");
return -1;
}
else
return (dado[topo--]);
}
public void imprime(){
int i;
for(i=0; i