You are on page 1of 21

Algoritmos de manipulao de estruturas elementares de dados

Pilhas e Filas

Prof. Rosana Palazon

INTRODUO

O objetivo desta aula o de conceituar as estruturas de dados: Pilhas e Filas abordando suas diferentes implementaes e seus mecanismos de manipulao.

Pilha e Fila Conceitos

Uma pilha, assim como uma fila, simplesmente uma lista linear de informaes (2).
Tanto a pilha como a fila podem ser implementadas por meio de uma lista encadeada ou de um vetor. O que difere uma pilha de uma fila o mecanismo responsvel pelo armazenamento e recuperao dos seus elementos (2). Enquanto a fila obedece ao princpio FIFO (First In First Out), uma pilha (ou stack) manipulada pelo mecanismo LIFO (Last In First Out). (1) A analogia mais prxima que se faz de uma pilha compar-la a uma pilha de pratos (2), e a mais prxima de uma fila a prpria fila nica de um banco ou supermercado.

Pilha - Conceitos

O conceito de pilha usado em muitos softwares de sistemas incluindo compiladores e interpretadores. (A maioria dos compiladores C usa pilha quando passa argumentos para funes) (2).. As duas operaes bsicas armazenar e recuperar so implementadas por funes tradicionalmente chamadas de push e pop, respectivamente (2).. A funo push() coloca um item na pilha e a funo pop() recupera um item da pilha.

A regio de memria a ser utilizada como pilha pode ser um vetor, ou uma rea alocada dinamicamente (2)..

Pilha Representao Grfica (2).


Ao:
1. push (A)
2. push (B) 3. push (C) 4. pop ( ) recupera C 5. push (D) 6. pop ( ) recupera D 7. pop ( ) recupera B

B
A
1.

B
A
3.

B
A
4.

B
A
5.

B
A
6.

8. pop ( ) recupera A

A
2.

A
7. 8.

Interface do tipo Pilha

Operaes bsicas:

criar uma pilha vazia inserir um elemento (push) retirar um elemento (pop) verificar se a pilha est vazia liberar a estrutura pilha mostrar a pilha(*)

Pilha Implementao em C usando vetor.


#include <stdio.h> #include <stdlib.h> #define N 50
typedef struct pilha{ int n; float vet[N]; }Pilha; Pilha *pilha_cria(){ Pilha *p=(Pilha*)malloc(sizeof(Pilha)); p->n=0; return p; } int pilha_vazia(Pilha *p){ return(p->n==0); }

Pilha Implementao em C usando vetor (cont)


void pilha_push(Pilha *p, float v) { if(p->n==N){ printf("Capacidade da pilha esgotada.\n"); exit (1); //aborta o programa } //insere novo elemento p->vet[p->n]=v; p->n++; } float pilha_pop(Pilha *p){ float v; if(pilha_vazia(p)){ printf("Pilha vazia.\n"); exit (1); } //retira o elemento da pilha v=p->vet[p->n-1]; p->n--; return v; }

Pilha Implementao em C usando vetor (cont)


void pilha_libera(Pilha *p){ free(p); } void mostra_pilha(Pilha *p) { printf("Contedo da pilha\n"); for(int i=p->n-1;i>=0;i--) printf("%0.f\n",p->vet[i]); printf("\n"); } void menu(){ system("cls"); printf("Escolha uma das opcoes do menu: \n"); printf("1. Empilha (push)\n"); printf("2. Retira (pop)\n"); printf("3. Mostra a pilha\n"); printf("4. Fim\n"); }

Pilha Implementao em C usando vetor


main(){ (cont) Pilha *pi=pilha_cria(); int opmenu; float item; do{ menu(); scanf("%d", &opmenu); switch (opmenu) { case 1 : //insere printf("Digite o valor a ser empilhado: "); scanf("%f", &item); pilha_push(pi,item); break; case 2 : //retira printf("Elemento retirado = %.0f\n",pilha_pop(pi)); break; case 3 : //mostra mostra_pilha(pi); break; } //switch printf("\n"); system("pause"); } while(opmenu!=4); }

Filas - Conceitos

A estrutura de fila anloga ao conceito que temos de filas em geral. O primeiro a chegar sempre o primeiro a sair, e a entrada de novos elementos sempre se d no fim da fila. Em computao vemos este conceito sendo implementado em filas de impresso(3). Assim como as pilhas, uma fila tambm pode ser implementada por meio de um vetor ou de uma lista encadeada.

Interface do tipo Fila

Operaes bsicas:

criar uma fila vazia inserir um elemento no fim retirar um elemento do incio verificar se a fila est vazia liberar a estrutura fila mostrar a fila (*)

Fila Implementao em C usando vetor.


#include <stdio.h> #include <stdlib.h> #define N 5 typedef struct fila{ int n; int ini; float vet[N]; }Fila;

Fila *fila_cria(){ Fila *f=(Fila*)malloc(sizeof(Fila)); f->n=0; f->ini=0; return f; } int fila_vazia(Fila *f){ return(f->ini==5||f->n==0); }

Fila Implementao em C usando vetor


void fila_insere (Fila *f, float v) { if(f->n==N){ //fila cheia printf("Capacidade da fila esgotada.\n"); return; //retorna ao programa } //insere novo elemento f->vet[f->n]=v; f->n++; } float fila_retira(Fila *f){ float v; if(fila_vazia(f)){ printf("fila vazia.\n"); return -1; } //retira o elemento da fila v=f->vet[f->ini]; f->ini++; return v; }

Fila Implementao em C usando vetor void fila_libera(Fila *f){


free(f);

} void mostra_fila(Fila *f){ printf("Contedo da fila\n"); int i; for(i=f->ini;i<f->n;i++) printf("%0.f\n",f->vet[i]); printf("\n"); } void menu(){ system("cls"); printf("Escolha uma das opcoes do menu: \n"); printf("1. Enfilera\n"); printf("2. Retira \n"); printf("3. Mostra a fila\n"); printf("4. Fim\n"); }

Fila Implementao em C usando main(){ vetor Fila *fi=fila_cria();


int opmenu; float item; do{ menu(); scanf("%d", &opmenu); switch (opmenu){ case 1 : //insere printf("Digite o valor a ser enfileirado: "); scanf("%f", &item); fila_insere(fi,item); break; case 2 : //retira printf("Elemento retirado = %.0f\n",fila_retira(fi)); break; case 3 : //mostra mostra_fila(fi); break; }//switch printf("\n"); system("pause"); } while(opmenu!=4); }

Listas X Pilhas e Filas

Filas e pilhas tm regras bastante rigorosas para acessar dados, e as operaes de recuperao tm carter destrutivo (3).

Pilhas e filas implementadas em vetores usam regies contguas de memria, listas no necessariamente(2).
Listas encadeadas podem ser acessadas randmica(quando se tem o endereo do item), mas normalmente so acessadas sequencialmente, pois cada item de uma lista contem alm da informao um elo de ligao ao prximo item da cadeia, o que torna sua estrutura um pouco mais complexa(4) . Alm disso, a recuperao de um item da lista encadeada no causa a sua destruio. ( preciso uma operao de excluso especfica para esta finalidade) (2).

Atividades
1. Implementar a interface pilha usando lista, como se segue: typedef struct lista { float valor; struct lista *prox; }Lista; typedef struct { Lista *li; }Pilha;

Atividades (cont)
2. Implementar a interface fila usando lista, como se segue: typedef struct lista { float valor; struct lista *prox; }Lista; typedef struct { Lista *ini; Lista *fim; }Fila;

Atividades (cont)

Operaes bsicas:

criar uma pilha/fila vazia inserir um elemento no fim retirar um elemento verificar se a pilha/fila est vazia liberar a estrutura pilha/fila mostrar a pilha/fila (*)

Referncias Bibliogrficas
Forbellone,A.L; Eberspacher,H.F. Lgica de programao A construo de algoritmos e estrutura de dados. Makron Books. 2. Schildt,H. C Completo e Total. Makron Books. 3. Celes, W.; Cerqueira,R.;Rangel, J. L. Introduo a estrutura de dados uma introduo com tcnicas de programao em C. Campus/Sociedade Brasileira de Computao (SBC). 4. Feofillof, P. Projeto de algoritmos. http://www.ime.usp.br/~pf/algoritmos/
1.