Computação - Informática - DAINF

Propaganda
Computação 2
Linguagem C
“Pilhas e Filas com Alocação Dinâmica”.
Slides: Prof. João Fabro
UTFPR - Curitiba
O que são “Pilhas” e “Filas”
• Pilhas e Filas são estruturas de dados com
alocação dinâmica: são Listas Encadeadas!
• Ao implementar mecanismos de inserção e
remoção de elementos da Lista Encadeada,
pode-se definir se a Lista comporta-se como
uma Fila ou uma Pilha!
O que são “Pilhas” e “Filas”
• Fila: A inserção ocorre na última posição, e a
remoção ocorre na primeira posição - o primeiro
a entrar na fila é também o primeiro a sair!
• Pilha: Neste caso, tanto a inserção quanto a
remoção de elementos ocorre sempre na
primeira posição - o último a entrar na pilha é
também o primeiro a sair! (Imagine de uma
pilha de livros sobre a mesa, por exemplo!)
O que são “Pilhas” e “Filas”
• As duas estruturas de dados são implementadas
com base na estrutura de Lista Encadeada
apresentada na aula passada.
• A seguir é apresentado um exemplo de uma
Pilha.
#include <stdio.h>
#include <stdlib.h>
struct Elemento
{
char nome [100];
struct Elemento* prox;
};
int main()
{
char escolha;
primeiro = NULL; //Inicia a Pilha Vazia!
for ( ; ; )
{
escolha = menu ();
switch ( escolha )
{
case ‘i' :
case ‘I' : { insere(); } break;
struct Elemento* primeiro;//Ponteiro para o “topo”
// da Pilha
case 'm' :
case 'M' : { mostra_todos(); } break;
char menu ();
case ‘r' :
case ‘R' : { remove(); } break;
void insere ();
case ‘t' :
case ‘T' : {
exit ( 0 );
} break;
default : { printf ( "Opcao invalida. \n" ); }
void mostra_todos();
void remove ();
}
printf ( "\n \n \n" );
}
system ( "Pause" );
return 0;
}
void insere ()
{
system ( "cls" );
printf ( "\n \n \n" );
struct Elemento* novo;
novo = malloc ( 1 * sizeof (struct Elemento) );
novo->proximo = primeiro;
printf ( “Digite o Nome a inserir na Pilha: \n" );
fflush ( stdin );
gets ( novo->nome );
primeiro = novo;
}
void remove ()
{
system ( "cls" );
printf ( "\n \n \n" );
struct Elemento *aux;
if(primeiro != NULL)
{
aux = primeiro; // aux aponta para o primeiro!
primeiro = primeiro ->proximo; //primeiro aponta
//para o “segundo”
printf(“ Nome removido da Pilha: %s\n”, aux->nome);
free(aux); //Libera a área de memória onde o nome estava
}
else
printf(“Pilha Vazia!!!\n”);
}
void mostra_todos ()
{
system ( "cls" );
printf ( "\n \n \n" );
struct Elemento *aux;
aux = primeiro;
while ( aux != NULL )
{
printf ("%s \n", aux->nome
aux = aux->proximo;
}
}
);
char menu ()
{
printf ("\n \n \n");
char opcao;
printf ( "(I)nserir novo nome na pilha. \n" );
printf ( "(M)ostrar todos . \n" );
printf ( "(R)emover um nome da pilha. \n" );
printf ( "(T)erminar. \n" );
fflush ( stdin );
scanf ( "%c", &opcao );
return opcao;
}
Download