From 839846285d72e08d1218846b51e7f255260672d3 Mon Sep 17 00:00:00 2001 From: joeljonassi Date: Sun, 3 Nov 2024 16:01:33 +0000 Subject: [PATCH] Generic stack in C --- .../5.Generic Stack/generic_stack.c | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 01. DataStructures/02. Stack/Basic Operation/5.Generic Stack/generic_stack.c diff --git a/01. DataStructures/02. Stack/Basic Operation/5.Generic Stack/generic_stack.c b/01. DataStructures/02. Stack/Basic Operation/5.Generic Stack/generic_stack.c new file mode 100644 index 00000000..9cff0936 --- /dev/null +++ b/01. DataStructures/02. Stack/Basic Operation/5.Generic Stack/generic_stack.c @@ -0,0 +1,157 @@ +#include +#include +#include +#include +#include +#include +#include + +typedef struct _stack_ { + void* data; + struct _stack_ *next; +} Stack; + +/** + * Element to be added to the stack + */ +typedef struct _user{ + char *name; + int age; +} User; + +/** + * Another Element to be added to the stack + */ +typedef struct _vehicle{ + char *brand; + char *model; + char *color; +} Vehicle; + + +/// +/// Check if the list is empty +/// +/// +/// +bool isEmpty(Stack* st) { + return st == NULL ? true : false; +} + +/// +/// Create a Node +/// +/// +/// +/// +Stack* createNode(Stack* st, void* data) { + st = (Stack*)malloc(sizeof(Stack)); + st->data = data; + st->next = NULL; + return st; +} + +/// +/// Push the element to the stack +/// +/// +/// +/// +Stack* push(Stack* st, void* data) { + if (st == NULL) { + st = createNode(st, data); + } + else { + Stack* newNode = NULL; + newNode = createNode(newNode, data); + newNode->next = st; + return newNode; + } + return st; +} + +/// +/// Pop the element to the stack +/// +/// +/// +Stack* pop(Stack* st) { + void* data = NULL; + Stack* auxNode; + if (isEmpty(st)) { + printf("Stack is underflow"); + } + else { + data = st->data; + auxNode = st; + st = st->next; + free(auxNode); + } + return st; +} + + +/// +/// Get the most top element to the stack +/// +/// +/// +void* top(Stack st) { + if(isEmpty(&st)) + return NULL; + return st.data; +} + +/// +/// Get the element at the given position +/// +/// +/// +/// +void* peek(Stack st, int pos) { + Stack* node = &st; + if (isEmpty(&st)) + return NULL; + for (int i = 0; i < pos && node != NULL; i++) { + node = node->next; + } + return node != NULL ? node->data : NULL; +} + +void display(void *data, void (*displayFunc)(void*)) { + displayFunc(data); +} + +void displayUser(void* data) { + User* user = (User*)data; + if(user!= NULL) { + printf("Name: %s Age %d\n",user->name, user->age); + } +} + +void displayVehicle(void* data) { + Vehicle* vehicle = (Vehicle*)data; + if(vehicle!= NULL) { + printf("Brand: %s Model: %s Color: %s\n",vehicle->brand, vehicle->model, vehicle->color); + } +} + + + +int main() +{ + Stack* stl = NULL; + User* user = (User*)malloc(sizeof(User)); + user->name = "john Doe"; + user->age = 25; + Vehicle* vehicle = (Vehicle*)malloc(sizeof(Vehicle)); + vehicle->brand = "Jia"; + vehicle->model = "Rio"; + vehicle->color = "Red"; + stl = push(stl, vehicle); + stl = push(stl, user); + + display(top(*stl), &displayUser); + display(top(*stl->next), &displayVehicle); + return 0; +}