From 0d66be9954dbc81410500d9200f0598872bfc36d Mon Sep 17 00:00:00 2001
From: "paul.albuquer" <paul.albuquerque@hesge.ch>
Date: Sun, 14 Nov 2021 13:21:03 +0100
Subject: [PATCH] implementation stack with array and pointers

---
 source_codes/piles/pile_array_int.c    | 68 ++++++++++++++++++
 source_codes/piles/pile_array_int.h    | 35 ++++++++++
 source_codes/piles/pile_ptr_int.c      | 96 ++++++++++++++++++++++++++
 source_codes/piles/pile_ptr_int.h      | 32 +++++++++
 source_codes/piles/pile_ptr_int_skel.c | 50 ++++++++++++++
 5 files changed, 281 insertions(+)
 create mode 100644 source_codes/piles/pile_array_int.c
 create mode 100644 source_codes/piles/pile_array_int.h
 create mode 100644 source_codes/piles/pile_ptr_int.c
 create mode 100644 source_codes/piles/pile_ptr_int.h
 create mode 100644 source_codes/piles/pile_ptr_int_skel.c

diff --git a/source_codes/piles/pile_array_int.c b/source_codes/piles/pile_array_int.c
new file mode 100644
index 0000000..8efa1af
--- /dev/null
+++ b/source_codes/piles/pile_array_int.c
@@ -0,0 +1,68 @@
+#include <stdlib.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <limits.h>
+#include"pile_array_int.h"
+
+bool pile_est_valide(pile stack) {
+   return (stack.capacite > 0 && stack.sommet >= -1 && stack.data != NULL);
+}
+
+bool pile_est_vide(pile stack) {
+   assert(pile_est_valide(stack));
+   return (-1 == stack.sommet);
+}
+
+bool pile_est_pleine(pile stack) {
+   assert(pile_est_valide(stack));
+   return (stack.capacite-1 == stack.sommet);
+}
+
+int pile_count(pile stack) {
+   assert(pile_est_valide(stack));
+   return stack.sommet+1;
+}
+
+int pile_sommet(pile stack) {
+   assert(!pile_est_vide(stack));
+   return stack.data[stack.sommet]; 
+}
+
+pile pile_creer(int max) {
+   assert(max > 0);
+   pile stack;
+   stack.capacite = max;
+   stack.sommet = -1;
+   stack.data = malloc(max*sizeof(int));
+   return stack;
+}
+
+void pile_resize(pile* stack,int max) {
+   assert(pile_est_valide(*stack));
+   if (max > stack->capacite) {
+      stack->capacite = max;
+      stack->data = realloc(stack->data,max*sizeof(int));
+   }
+}
+
+void pile_detruire(pile* stack) {
+   stack->capacite = -1;
+   stack->sommet = INT_MIN;
+   free(stack->data);
+   stack->data = NULL;
+}
+
+void pile_empiler(pile* stack,int val) {
+   if (pile_est_pleine(*stack)) {
+      pile_resize(stack,stack->capacite+INCR);
+   }
+   stack->sommet++;
+   stack->data[stack->sommet] = val;
+}
+
+int pile_depiler(pile* stack) {
+   int val = pile_sommet(*stack);
+   stack->sommet--;
+   return val; 
+}
+
diff --git a/source_codes/piles/pile_array_int.h b/source_codes/piles/pile_array_int.h
new file mode 100644
index 0000000..78dc7b1
--- /dev/null
+++ b/source_codes/piles/pile_array_int.h
@@ -0,0 +1,35 @@
+#ifndef PILE_ARRAY_INT_H
+#define PILE_ARRAY_INT_H
+
+#include <stdbool.h>
+const int INCR = 100;
+
+typedef struct _pile {
+   int* data;
+   int sommet;
+   int capacite;
+} pile;
+
+//Créer une nouvelle pile vide
+pile pile_creer(int max);
+//Libérer le tableau, mettre la capacité à < -1
+void pile_detruire(pile* stack);
+//Empiler un élement au sommet de pile
+void pile_empiler(pile* stack,int val);
+//Dépiler un élément du sommet de la pile
+int pile_depiler(pile* stack);
+//Tester si la pile est vide
+bool pile_est_vide(pile stack);
+//Tester si la pile est pleine
+bool pile_est_pleine(pile stack);
+//Consulter l'élément au sommet de la pile
+int pile_sommet(pile stack);
+//Compter du nombre d'éléments de la pile:
+int pile_count(pile stack);
+
+#endif
+
+
+
+
+
diff --git a/source_codes/piles/pile_ptr_int.c b/source_codes/piles/pile_ptr_int.c
new file mode 100644
index 0000000..c1f3b0e
--- /dev/null
+++ b/source_codes/piles/pile_ptr_int.c
@@ -0,0 +1,96 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <assert.h>
+#include "pile_ptr_int.h"
+
+
+//Creer une nouvelle pile vide
+pile pile_creer() {
+   return NULL;
+}
+
+//Tester si la pile est vide
+bool pile_est_vide(pile stack) {
+	return (NULL == stack);
+}
+
+//Inserer un élement en début de pile
+void pile_empiler(pile* stack,int data) {
+   element* elmt = malloc(sizeof(element));
+   elmt->data = data;
+   elmt->next = *stack;
+   *stack = elmt;
+}
+
+//Consulter l'élément au sommet de la pile
+int pile_sommet(pile stack) {
+   assert(!pile_est_vide(stack));
+   return stack->data;
+}
+
+//Supprimer un élément de la pile
+int pile_depiler(pile* stack) {
+   int data = pile_sommet(*stack);
+   element* elmt = *stack;
+   *stack = (*stack)->next; 
+   free(elmt);    
+   return data; 
+}
+
+//Désallouer complètement la pile
+void pile_detruire(pile* stack) {
+   while (!pile_est_vide(*stack)) {      
+      int data = pile_depiler(stack);
+   }   
+}
+
+//Compter le nombre d'éléments de la pile:
+int pile_count(pile stack) {
+   int cnt = 0;
+   while (NULL != stack) {      
+      stack = stack->next;
+      cnt++;
+   }
+   return cnt;
+}
+
+/////////////////////////////////////////////////////////
+/*
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include "stack.h"
+
+void print(void* a) {
+   int* b = (int*)a;
+   printf("%d ",*b);
+}
+int cmp(void* a,void* b) {
+   int* aa = (int*)a;
+   int* bb = (int*)b;
+   if (*aa == *bb) return 0;
+   else if (*aa < *bb) return -1;
+   else return 1;
+}
+   
+int main() {
+
+   Stack_Elmt* pile = stack_create();
+   int a = 3;
+   pile = stack_push(pile,&a);
+   int b = 6;
+   pile = stack_push(pile,&b);
+   int c = 7;
+   pile = stack_push(pile,&c);
+   stack_process(pile,print); printf("\n");
+   int d = 6;
+   Stack_Elmt* elmt = stack_pop(pile,&d,cmp);
+   int* tutu = (int*)(elmt->data);
+   printf("%d\n",*tutu);
+   stack_process(pile,print); printf("\n");
+   return 0;   
+}*/
+
+
+
diff --git a/source_codes/piles/pile_ptr_int.h b/source_codes/piles/pile_ptr_int.h
new file mode 100644
index 0000000..113525c
--- /dev/null
+++ b/source_codes/piles/pile_ptr_int.h
@@ -0,0 +1,32 @@
+/* pour éviter que le précompilateur inclue plusieurs fois le fichier .h */
+#ifndef PILE_PTR_INT_H  
+#define PILE_PTR_INT_H
+#include <stdbool.h>
+
+/* Utilité du typedef : Element a; <=> struct Element a; */
+typedef struct _element {
+   int data;
+   struct _element* next;
+} element;
+typedef element* pile;
+
+//Créer d'une nouvelle pile vide
+pile pile_creer();
+//Désallouer complètement la pile
+void pile_detruire(pile* stack);
+//Empiler un élement en début de pile
+void pile_empiler(pile* stack,int data);
+//Dépiler un élément de la pile
+int pile_depiler(pile* stack);
+//Consulter l'élément au sommet de la pile
+int pile_sommet(pile stack);
+//Tester si la pile est vide
+bool pile_est_vide(pile stack);
+//Compter le nombre d'éléments de la pile:
+int pile_count(pile stack);
+#endif
+
+
+
+
+
diff --git a/source_codes/piles/pile_ptr_int_skel.c b/source_codes/piles/pile_ptr_int_skel.c
new file mode 100644
index 0000000..9986b3a
--- /dev/null
+++ b/source_codes/piles/pile_ptr_int_skel.c
@@ -0,0 +1,50 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <assert.h>
+#include "pile_ptr_int.h"
+
+//Creer une nouvelle pile vide
+pile pile_creer() {
+   return NULL;
+}
+
+//Tester si la pile est vide
+bool pile_est_vide(pile stack) {
+   return (NULL == stack);
+}
+
+//Inserer un élement en début de pile
+void pile_empiler(pile* stack,int val) {
+   element* elmt = malloc(sizeof(element));
+   elmt->data = val;
+   elmt->next = *stack;
+   *stack = elmt;
+}
+
+//Consulter l'élément au sommet de la pile
+int pile_sommet(pile stack) {
+   assert(!pile_est_vide(stack));
+   return stack->data;
+}
+
+//Supprimer un élément de la pile
+int pile_depiler(pile* stack) {
+   int data = pile_sommet(*stack);
+   // à compléter    
+   return data; 
+}
+
+//Désallouer complètement la pile
+void pile_detruire(pile* stack) {
+   // à compléter   
+}
+
+//Compter le nombre d'éléments de la pile:
+int pile_count(pile stack) {
+   int cnt = 0;
+   // à compléter
+   return cnt;
+}
+
+
-- 
GitLab