Você está na página 1de 18

Faculdade Salesiana Dom Bosco de Piracicaba

Autores
Diego Don Jordan Toledo Wellinton Rodrigo

Estrutura de Dados: Fila

Piracicaba 2009

Faculdade Salesiana Dom Bosco de Piracicaba

Autores
Diego Don Jordan Toledo Wellinton Rodrigo

Estrutura de Dados: Fila

Trabalho

de

Aproveitamento

da

disciplina de Algoritmos e Programao II apresentado como exigncia parcial para obteno do grau de Bacharel em Sistemas de Informao no Centro Universitrio orientao Salesiano, dos sob a Professores Silvia

Magossi e Jos Carlos Magossi.

Piracicaba 2009

Autor: ____________________________________________________ Autor: ____________________________________________________ Autor: ____________________________________________________ Ttulo: ____________________________________________________ Trabalho sobre filas, apresentado como exigncia parcial para obteno de nota do segundo semestre do curso de Sistemas de Informao na Instituio Faculdade Salesiana Dom Bosco de Piracicaba. Trabalho referente nota do primeiro semestre de Sistemas de Informao entregue em __/__/____ pelos professores:

(Assinatura) ________________________________________________ (Titulao/nome/instituio) (Assinatura) ________________________________________________ (Titulao/nome/instituio)

Piracicaba 2009

RESUMO

Tratamos neste trabalho sobre a fila, um tipo de Estrutura de Dados muito utilizado na computao. Fazemos a associao com elementos da vida real, para facilitar o entendimento, demonstramos a lgica utilizada e apresentamos o cdigo final em linguagem C. Alm do funcionamento padro da fila, como insero e retirada de elementos, apresentamos funcionalidades como ordenao, busca e exibio da fila.

Palavras-chave:

1. Estrutura de Dados; 2. Fila; 3. Linguagem C;

SUMRIO
1. Introduo...........................................................................................................6 2. Filas na vida real, filas na computao ...............................................................7 3. Problema associado fila...................................................................................7 4. Tipos de Fila .......................................................................................................7 4.1. Fila linear......................................................................................................8 4.2. Fila Circular ..................................................................................................9 5. Cdigo fonte comentado...................................................................................10 5.1. Cabealho do arquivo ................................................................................10 5.2. Funo Main ..............................................................................................11 5.3. Funo Inserir ............................................................................................13 5.4. Funo Eliminar .........................................................................................13 5.5. Funo Mostrar ..........................................................................................14 5.6. Funo Preencher ......................................................................................14 5.7. Funo BubbleSort ....................................................................................15 5.8. Funo BuscaSequencial...........................................................................15 6. Concluso.........................................................................................................17 7. Referncia Bibliogrfica ....................................................................................18

Introduo
Quando pensamos numa fila da vida real, seja uma fila de atendimento no banco, na padaria ou no supermercado, imaginamos elementos normalmente pessoas sendo atendidos em ordem de chegada. Pessoas chegam ao final da fila e pessoas so atendidas, saindo da fila. O importante notar a ordem que existe nela. Ningum deveria furar a fila. Se voc o terceiro da fila, no ser atendido em segundo lugar, nem em quarto. Ser atendido em terceiro lugar. Existem excees, podemos deixar algum com mais prioridade passar a nossa frente, trocar de lugar e outras modificaes na ordem original. Entretanto, existe uma ordem a ser respeita. A idia fundamental da fila que s podemos inserir um novo elemento no fina l da fila e s podemos retirar o elemento do incio (W. Celes e J. L. Rangel, Apostila de Estruturas de Dados, pg. 126). Uma fila nada mais que uma sequncia de elementos ordenadas pela ordem de chegada, tanto na vida real como na programao.

Filas na vida real, filas na computao


Na computao, ao invs de pessoas, utilizamos caracteres e nmeros, por exemplo. Para representar a ordem de chegada e sada, podemos utilizar um vetor. Adotamos a posio n-1 ou a 0 como ponto de chegada e sada. Uma fila de banco pode ser visualizada quarteires antes do ponto inicial, algumas vezes. No computador as filas tambm podem possuir muitos elementos, mas precisamos escrever uma rotina que a mostre ao usurio, caso seja interessante.

Problema associado fila


Um sistema de impressora em rede, recebendo arquivos de diversos computadores para serem impressos um exemplo de utilizao de fila. Se no utilizssemos uma estrutura com fila, criar uma ordem de impresso seria impossvel.

Tipos de Fila
Quando lidamos com filas na computao, podemos classific-las em pelo menos dois tipos: Filas e Filas circulares. A fila linear de uma implementao mais simples e mais fcil de modificar conforme a necessidade, porm, exige um esforo de processamento maior. A fila circular mais complexa, mais difcil de modificar, mas paga com uma velocidade maior em seu processamento.

Fila linear
Simplesmente usamos um vetor e uma varivel auxiliar para marcar o fim da fila. Adotamos um lado do vetor para ser a entrada e o outro automaticamente ser onde os elementos entram o fim da fila. O esforo de processamento dessa alternativa se encontra quando retiramos um elemento da fila. Devemos re-organizar a fila, para que a posio eliminada no fique vazia, seno, num momento nossa fila estar completamente cheia e no poderemos inserir elementos.

Representao de uma Fila simples quando se retira um elemento.

Com um vetor de 4 posies ocupadas por inteiros, no parece grande problema. Mas com 100 elementos ocupados por outros vetores pode ser uma dificuldade. Temos que passar por todas as posies para ajustar corretamente.

Fila Circular
Tambm utilizamos um vetor, mas dessa vez, com duas variveis auxiliares: Incio e Fim. Conforme inserimos, incrementamos Fim. Conforme retiramos, incrementamos o Comeo. Se chegarmos ao fim do vetor, voltamos ao comeo. um ciclo de retiradas e inseres. Nosso algoritmo precisa prever mais detalhes, tomando cuidado para no estourar o limite e nem deixar as variveis com os valores errados. Por outro lado, nos livramos da necessidade de iterar por todas as posies para organizar a fila.

Simulao de retirada e insero numa fila circular, incrementando as variveis auxiliares.

Na figura acima, retiramos o primeiro elemento. O Comeo fica na segunda casa. Em seguida, inserimos um elemento. Fim fica valendo 1, pois j est na ltima posio livre e a prxima casa seria justamente a primeira. Por fim, retiramos mais um elemento. Note que se fossemos inserir mais algo, ele ficaria na casa ao lado direito do nmero 5.

10

Cdigo fonte comentado


Para facilitar o desenvolvimento do algoritmo e aplicao, o sistema de fila organizar apenas uma determinada quantidade de nmeros inteiros, num sistema de fila circular.

Cabealho do arquivo

#include <stdio.h> #include <string.h> #define NUM 4 void inserir(int lista[], int num, int *c, int *f); void mostrar(int lista[], int tam); void eliminar(int lista[], int *c, int *f); void bubbleSort(int lista[], int *c, int *f); void buscaSequencial(int lista[], int numero); void preencher(int lista[], int tam);

Temos o include padro (stdio.h) e o string.h, para poder usar a funo toupper. Alm disso, declaramos uma constante com o tamanho da fila e o cabealho das funes. As funes inserir, eliminar e bubbleSort usam algo um pouco diferente: int *c e int *f. Com isso, requisitamos um endereo de memria de um inteiro, no um valor inteiro. Fazemos isso, pois, podemos em cada funo mexer com o comeou e/ou fim da fila. Isso se chama passagem por referncia. Com essa tcnica, dispensamos o return, pois estamos lidando diretamente com o valor contido no endereo e o seu valor altera a varivel que foi passada na funo main.

11 Inserir ser responsvel por colocar os nmeros na fila. Pede-se a fila, o numero a ser inserido e dois endereos de memria (c e f). Mostrar vai permitir a visualizao da fila. Pede-se a lista e o seu tamanho. Eliminar retira o primeiro item na fila. Pede-se a fila e dois endereos de memria (c e f). BubbleSort o algoritmo de ordenao da lista. Pede-se a fila e dois endereos de memria (c e f). BuscaSequencial o algoritmo de busca na fila. Pede-se a fila e o nmero a ser buscado. Preencher uma funo auxiliar, utilizada apenas para zerar todas as posies do vetor. Fazemos isso, pois convencionamos 0 como vazio. Pede-se a fila e o seu tamanho.

Funo Main

int main(int argc, char *argv[]) { //fC = fila Circular, c = comeo, f = fim int fC[NUM],c=0,f=0,numInsert,numBusca; char opcao; preencher(fC,NUM); printf("Programa de simulacao de fila.\n"); printf("Para inserir um numero, digite 'i'\n"); printf("Para eliminar um numero, digite 'e'\n"); printf("Para buscar um numero, digite 'b' e informe o numero\n"); printf("Para organizar a fila, digite 'o'\n"); printf("Para sair, digite 's'\n\n"); do { //printf("Choose your destiny: "); printf("Qual sua escolha? "); fflush(stdin); scanf("%c",&opcao); if(toupper(opcao) == 'I') { printf("Digite o valor a ser inserido: "); scanf("%d",&numInsert);

12
inserir(fC,numInsert,&c,&f); printf("\nVisualizacao da fila: "); mostrar(fC,NUM);

} else if(toupper(opcao) == 'E') { eliminar(fC,&c,&f); printf("Visualizacao da fila: "); mostrar(fC,NUM); printf("\n"); } else if(toupper(opcao) == 'B') { printf("Digite o valor a ser buscado: "); scanf("%d",&numBusca); buscaSequencial(fC,numBusca); } else if(toupper(opcao) == 'O') { bubbleSort(fC,&c,&f); printf("\nVisualizacao da fila ordenada: "); mostrar(fC,NUM); } } while(toupper(opcao) != 'S'); system("PAUSE"); return 0; }

Em main() damos uma mensagem na tela de como utilizar o programa. Lemos um caractere e o testamos contra todas as possibilidades disponveis. I permite inserir novos elementos na fila, lendo o nmero a ser inserido e chamando a funo Inserir. E elimina o primeiro elemento da fila. B busca um elemento na fila. O permite a ordenao do vetor. S termina o programa

13

Funo Inserir

void inserir(int lista[], int num, int *c, int *f) { //F e C so iguais (mesma casa) //Porm esta casa est em branco. Quero poder preenche-la //"Se a casa esta em branco, preencha, mas no aumente F" //(no aumentamos F pois s preenchemos a ultima casa) if((*f+1) % NUM == *c && lista[*f] == 0) { lista[*f] = num; } //F e C NO so iguais e a casa est vazia (0) //preencho e aumento F else if((*f+1) % NUM != *c && lista[*f] == 0) { lista[*f] = num; *f = (*f+1) % NUM; } //F e C NO so iguais(eliminei algo) e a casa est ocupada //mudamos de casa para no sobrescrever //e depois preenchemos a nova casa com o valor else if((*f+1) % NUM != *c && lista[*f] != 0) { *f = (*f+1) % NUM; lista[*f] = num; } //para todos os outros casos... else printf("A fila esta cheia, nenhum elemento inserido.\n"); }

Funo Eliminar

void eliminar(int lista[], int *c, int *f) { //se o comeo e o fim estiverem na mesma casa //e ela estiver "vazia" (representado por 0) if(*f == *c && lista[*c] == 0) printf("A fila esta vazia, nenhum elemento retirado.\n\n"); else {

14
lista[*c] = 0; //se F e C forem iguais evito de C passar o F //se no quebraria a ordem da fila if(*f != *c) { *c = (*c+1) % NUM; } //se estiverem na mesma casa, passo ambos para a prxima //isso evita de inserir na ltima casa aps ordenao else { *f = (*f+1) % NUM; *c = (*c+1) % NUM; }

} }

Funo Mostrar

void mostrar(int lista[], int tam) { int i; for(i = 0; i <= tam -1; i++) printf("[%d]",lista[i]); printf("\n\n"); }

Funo Preencher

void preencher(int lista[], int tam) { int i; for(i = 0; i <= tam -1; i++) lista[i] = 0; }

15

Funo BubbleSort

void bubbleSort(int lista[], int *c, int *f) { int i=0, tmp; //comea com verdade short int troca=1; while(troca) { //rezo pra que fique organizado troca=0; for(i=0; i < NUM; i++) { if(lista[i] > lista[i+1]) { tmp = lista[i]; lista[i] = lista[i+1]; lista[i+1] = tmp; troca=1;

} } }

//est ordenado, re-iniciamos o fim comeo da fila *c = 0; *f = NUM-1; }

Funo BuscaSequencial

void buscaSequencial(int lista[], int numero) { int i=0; short int achou=0; for(i=0; i < NUM; i++) { if(lista[i] == numero) { printf("\nElemento %d encontrado na posicao %d.\n\n",numero,i+1); achou=1; break; }

16
} if(!achou) printf("\nElemento nao encontrado. Foi mal.\n\n"); }

17

Concluso
Com a utilizao de filas temos uma ferramenta de organizao interessante, que pode ter muitas funcionalidades implementadas. Poderamos ter feito com que o elemento na sada fosse processado e retirado automaticamente como no caso da fila de impresso. importante utilizar este recurso. Se filas so importantes na vida real, elas tambm tm seu espao garantido na rea da computao.

18

Referncia Bibliogrfica
Waldemar Celes; Jos Lucas Rangel. Apostila de Estruturas de Dados. Curso de Engenharia PUC-RIO, 2002. Universidade de So Paulo - So Carlos, SP, Instituto de Cincias Matemticas e de Computao, Departamento de Computao e Estatstica. Material sobre fila circular. Disponvel em http://www.icmc.usp.br/~sce182/fcirc.html, acesso em 21 out. 2009. HTMLSTAFF. Estrutura de Dados em C Fila Circular com operador mdulo. Disponvel em http://www.htmlstaff.org/ver.php?id=3960, acesso em 31 de ago. 2009.

Você também pode gostar