-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpila.c
81 lines (72 loc) · 1.95 KB
/
pila.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "pila.h"
#include <stdlib.h>
/* Definición del struct pila proporcionado por la cátedra.
*/
struct pila {
void** datos;
size_t cantidad; // Cantidad de elementos almacenados.
size_t capacidad; // Capacidad del arreglo 'datos'.
};
/* *****************************************************************
* PRIMITIVAS DE LA PILA
* *****************************************************************/
#define CAPACIDAD_INICIAL 8
#define CONSTANTE_REDIMENSION 2
#define CONSTANTE_CANTIDAD_MINIMA 4
pila_t* pila_crear(void){
pila_t* pila = malloc(sizeof(pila_t));
if (pila == NULL){
return NULL;
}
pila->capacidad = CAPACIDAD_INICIAL;
pila->cantidad = 0;
pila->datos = malloc(pila->capacidad * sizeof(void*));
if (pila->datos == NULL) {
free(pila);
return NULL;
}
return pila;
}
bool redimensionar_pila(pila_t *pila, size_t capacidad_nueva){
void** datos_nuevo = realloc(pila->datos, capacidad_nueva * sizeof(void*));
if (datos_nuevo == NULL){
return false;
}
pila->capacidad = capacidad_nueva;
pila->datos = datos_nuevo;
return true;
}
void pila_destruir(pila_t *pila){
free(pila->datos);
free(pila);
}
bool pila_esta_vacia(const pila_t *pila){
return pila->cantidad == 0;
}
bool pila_apilar(pila_t *pila, void* valor){
if (pila->cantidad == pila->capacidad){
if (!redimensionar_pila(pila, pila->capacidad * CONSTANTE_REDIMENSION)){
return false;
}
}
pila->datos[pila->cantidad] = valor;
pila->cantidad++;
return true;
}
void* pila_ver_tope(const pila_t *pila){
if (pila_esta_vacia(pila)){
return NULL;
}
return pila->datos[pila->cantidad-1];
}
void* pila_desapilar(pila_t *pila){
if (pila_esta_vacia(pila)){
return NULL;
}
void* valor_desapilado = pila_ver_tope(pila);
pila->cantidad --;
if (CONSTANTE_CANTIDAD_MINIMA * pila->cantidad <= pila->capacidad && CAPACIDAD_INICIAL <= pila->cantidad){
redimensionar_pila(pila, pila->capacidad / CONSTANTE_REDIMENSION);
}
return valor_desapilado;
}