-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstack.c
More file actions
91 lines (68 loc) · 1.49 KB
/
stack.c
File metadata and controls
91 lines (68 loc) · 1.49 KB
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
82
83
84
85
86
87
88
89
90
91
#include "stack.h"
/**
* Internal
*/
StackInt *to_stack_int(STACK_T *s)
{
return (StackInt *)s;
}
int stack_int_resize(StackInt *ss, size_t size)
{
if ((ss->len * sizeof(int)) >= size) return -1;
int *tmp = malloc(ss->size);
memcpy(tmp, ss->arr, ss->size);
ss->arr = realloc(ss->arr, size);
memcpy(ss->arr, tmp, ss->size);
ss->size = size;
return 1;
}
/**
* Public
*/
STACK_T *stack_int_init(size_t capacity)
{
if (capacity <= 0) return NULL;
StackInt *s;
s = malloc(sizeof(StackInt));
s->len = 0;
s->size = capacity * sizeof(int);
s->arr = (int *)malloc(s->size);
return (STACK_T *)s;
}
int stack_int_add(STACK_T *s, int item)
{
StackInt *ss = to_stack_int(s);
if ((ss->len * sizeof(int)) >= ss->size)
if (stack_int_resize(ss, (ss->size + sizeof(int))) == -1)
return -1;
ss->arr[ss->len] = item;
ss->len += 1;
return 1;
}
int stack_int_pop(STACK_T *s)
{
StackInt *ss = to_stack_int(s);
if (ss->len == 0) return -1;
int tmp = ss->arr[ss->len-1];
ss->arr[ss->len-1] = 0;
ss->len -= 1;
if (stack_int_resize(ss, (ss->size - sizeof(int))) == -1)
return -1;
return tmp;
}
int stack_int_size(STACK_T *s)
{
StackInt *ss = to_stack_int(s);
return ss->size;
}
int stack_int_len(STACK_T *s)
{
StackInt *ss = to_stack_int(s);
return ss->len;
}
void stack_clean(STACK_T *s)
{
StackInt *ss = to_stack_int(s);
free(ss->arr);
free(ss);
}