Baixe o app para aproveitar ainda mais
Prévia do material em texto
Exemplo de implementação de pilha GENÉRICA utilizando *VOID Arquivo types.h #ifndef ESTRUTURAS #define ESTRUTURAS typedef union dado { char car; int inteiro; float real; } TDado; typedef struct no { void * info; struct no * prox; } TNo; typedef struct descritor { int tipo; TNo * topo; } TDescritor; typedef TDescritor * Stack; #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef INTEIRO #define INTEIRO 1 #endif #ifndef REAL #define REAL 2 #endif #ifndef CARACTER #define CARACTER 3 #endif Arquivo stack.h #include "types.h" int isEmpty (Stack p); void push (Stack p, TDado d); TDado pop (Stack p); TDado top (Stack p); void initialize (Stack * p, int t); Arquivo stack.c #include <stdio.h> #include "types.h" int isEmpty (Stack p) { // teste se a pilha está vazia if (p->topo == NULL) return TRUE; else return FALSE; } void push (Stack p, TDado d) { // empilhar um valor, ou seja, insere no topo da pilha TNo * novo; int * num1; float * num2; char * car; novo = (TNo *) malloc (sizeof (TNo)); switch (p->tipo) { case INTEIRO: num1 = (int *) malloc (sizeof(int)); *num1 = d.inteiro; novo->info = num1; break; case REAL: num2 = (float *) malloc (sizeof(float)); *num2 = d.real; novo->info = num2; break; case CARACTER: car = (char *) malloc (sizeof(char)); *car = d.car; novo->info = car; break; } /*switch (p->tipo) { case INTEIRO: num1 = (TInt *) malloc (sizeof(TInt)); num1->valor = d.inteiro; novo->info = num1; break; case REAL: num2 = (TFloat *) malloc (sizeof(TFloat)); num2->valor = d.real; novo->info = num2; break; case CARACTER: car = (TChar *) malloc (sizeof(TChar)); car->valor = d.car; novo->info = car; break; } */ if (isEmpty (p) == TRUE) novo->prox = NULL; else novo->prox = p->topo; p->topo = novo; printf ("Valor empilhado com sucesso! \n"); } TDado pop (Stack p) { // desempilha, ou seja, retira o valor situado no topo da pilha int * num1; float * num2; char * car; TDado d; TNo * aux; aux = p->topo; p->topo = p->topo->prox; switch (p->tipo) { case INTEIRO: num1 = (int *) aux->info; d.inteiro = *num1; break; case REAL: num2 = (float *) aux->info; d.real = *num2; break; case CARACTER: car = (char *) aux->info; d.car = *car; break; } free (aux); return d; } TDado top (Stack p) { int * num1; float * num2; char * car; TDado d; switch (p->tipo) { case INTEIRO: num1 = (int *) p->topo->info; d.inteiro = *num1; break; case REAL: num2 = (float *) p->topo->info; d.real = *num2; break; case CARACTER: car = (char *) p->topo->info; d.car = *car; break; } return d; } void initialize (Stack *p, int t) { *p = (TDescritor *) malloc (sizeof (TDescritor)); (*p)->topo = NULL; (*p)->tipo = t; } Arquivo principal.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "types.h" #include "stack.h" void lerDado (TDado *d, int t) { if (t == INTEIRO) scanf_s ("%i", &((*d).inteiro)); else if (t == REAL) scanf_s ("%f", &((*d).real)); else scanf_s ("%c", &((*d).car)); fflush (stdin); } void exibirDado (TDado d, int t) { if (t == INTEIRO) printf ("%i\n", d.inteiro); else if (t == REAL) printf ("%f\n", d.real); else printf ("%c\n", d.car); } int main () { Stack minhaPilha; TDado valor; int tipo; char resp, op; printf ("Informe o tipo dos dados da pilha. Digite 1 p/ Inteiro, 2 p/ Real ou 3 p/ Caracter> "); scanf_s ("%i",&tipo); fflush (stdin); while (tipo != 1 && tipo != 2 && tipo != 3) { printf ("Tipo invalido. Digite 1 p/ Inteiro, 2 p/ Real ou 3 p/ Caracter> "); scanf_s ("%i",&tipo); fflush (stdin); } initialize (&minhaPilha, tipo); do { printf ("1 - Empilhar \n2 - Desempilhar \n3 - Ver topo \n4 - Sair \nDigite a opcao: "); op = getchar (); fflush (stdin); switch (op) { case '1': printf ("Informe o valor: "); lerDado (&valor,tipo); printf ("Empilhando ... \n"); push (minhaPilha, valor); break; case '2': if (isEmpty (minhaPilha) == TRUE) printf ("Pilha vazia \n"); else { valor = pop (minhaPilha); printf ("Valor desempilhado: "); exibirDado(valor,tipo); } break; case '3': if (isEmpty (minhaPilha) == TRUE) printf ("Pilha vazia \n"); else { valor = top (minhaPilha); printf ("Valor no topo da pilha: "); exibirDado(valor,tipo); } break; case '4': while (isEmpty (minhaPilha) == FALSE) pop (minhaPilha); break; default: printf ("Opcao invalida \n"); } } while (op != '4'); return 0; }
Compartilhar