Dynamic Stack
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct dyna_stack
{
void *data;
struct dyna_stack* down;
};
struct dyna_stack* top=NULL;
enum type_t{
INT,
CHAR,
STRING,
FLOAT
};
void push(enum type_t t,void* data)
{
size_t size;
switch(t)
{
case INT:
{ int *i = (int*) data;
size= sizeof(int);
break;
}
case CHAR:
{
char* c = (char*) data;
size= sizeof(char);
break;
}
case STRING:
{
char* s = (char *) data;
size= strlen(s);
break;
}
case FLOAT:
{
float* f = (float*) data;
size = sizeof(float);
break;
}
}
if(top == NULL)
{
struct dyna_stack* ptr = (struct dyna_stack*) malloc(sizeof(struct dyna_stack));
ptr->data = malloc(size);
memcpy(ptr->data,data,size);
ptr->down = NULL;
top=ptr;
}
else
{
struct dyna_stack* ptr = (struct dyna_stack*) malloc(sizeof(struct dyna_stack));
ptr->data = malloc(size);
memcpy(ptr->data,data,size);
ptr->down = top;
top = ptr;
}
}
void* pop(enum type_t t)
{
void *temp;
struct dyna_stack* ptr;
size_t size;
if(top == NULL)
{
printf("Underflow\n");
return;
}
else
{
switch(t)
{
case INT:
{int *i = (int*) top->data;
size= sizeof(int);
break;
}
case CHAR:
{ char* c = (char*) top->data;
size= sizeof(char);
break;
}
case STRING:
{ char* s = (char *) top->data;
size= sizeof(s);
break;
}
case FLOAT:
{ float* f = (float*) top->data;
size = sizeof(float);
break;
}
}
temp = malloc(size);
memcpy(temp,top->data,size);
free(top->data);
ptr = top;
top = top->down;
free(ptr);
}
return temp;
}
int main()
{ int a[5]={1,2,3,4,5};
push(INT,&a[0]);
push(INT,&a[1]);
push(INT,&a[2]);
printf("%d\n", *(int*)pop(INT));
printf("%d\n", *(int*)pop(INT));
printf("%d\n", *(int*)pop(INT));
printf("%d\n", *(int*)pop(INT));
}
Comments
Post a Comment