C Fundamentals
Algorithms · data structures · cryptography · systems — pure C11, zero deps
Loading...
Searching...
No Matches
stack.c
Go to the documentation of this file.
1/**
2 * @file stack.c
3 */
4
5#include "stack.h"
6#include <stdlib.h>
7
8#define CF_STACK_INITIAL_CAP 16
9
10struct cf_stack {
11 int *data;
12 size_t size;
13 size_t capacity;
14};
15
17 cf_stack_t *s = malloc(sizeof(*s));
18 if (!s) return NULL;
19 s->data = malloc(CF_STACK_INITIAL_CAP * sizeof(int));
20 if (!s->data) { free(s); return NULL; }
21 s->size = 0;
23 return s;
24}
25
27 if (!s) return;
28 free(s->data);
29 free(s);
30}
31
32bool cf_stack_push(cf_stack_t *s, int value) {
33 if (!s) return false;
34 if (s->size == s->capacity) {
35 size_t new_cap = s->capacity * 2;
36 int *grown = realloc(s->data, new_cap * sizeof(int));
37 if (!grown) return false;
38 s->data = grown;
39 s->capacity = new_cap;
40 }
41 s->data[s->size++] = value;
42 return true;
43}
44
45bool cf_stack_pop(cf_stack_t *s, int *out_value) {
46 if (!s || s->size == 0) return false;
47 s->size--;
48 if (out_value) *out_value = s->data[s->size];
49 return true;
50}
51
52bool cf_stack_peek(const cf_stack_t *s, int *out_value) {
53 if (!s || s->size == 0) return false;
54 if (out_value) *out_value = s->data[s->size - 1];
55 return true;
56}
57
58size_t cf_stack_size(const cf_stack_t *s) { return s ? s->size : 0; }
59bool cf_stack_is_empty(const cf_stack_t *s) { return !s || s->size == 0; }
bool cf_stack_pop(cf_stack_t *s, int *out_value)
Definition stack.c:45
bool cf_stack_is_empty(const cf_stack_t *s)
Definition stack.c:59
bool cf_stack_peek(const cf_stack_t *s, int *out_value)
Definition stack.c:52
void cf_stack_destroy(cf_stack_t *s)
Definition stack.c:26
#define CF_STACK_INITIAL_CAP
Definition stack.c:8
size_t cf_stack_size(const cf_stack_t *s)
Definition stack.c:58
cf_stack_t * cf_stack_create(void)
Definition stack.c:16
bool cf_stack_push(cf_stack_t *s, int value)
Definition stack.c:32
LIFO stack of int, backed by a growable dynamic array.
size_t capacity
Definition stack.c:13
int * data
Definition stack.c:11
size_t size
Definition stack.c:12