Buscar

Exemplo de implementação de uma pilha genérica utilizando void

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;
}

Continue navegando