-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstack.c
53 lines (44 loc) · 1.06 KB
/
stack.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
#include <stdlib.h>
#include "stack.h"
struct _Stack {
void **vector;
long size;
long used;
};
static void grow(Stack *);
Stack *create_stack(void) {
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->vector = (void **)malloc(sizeof(void *) * 16);
stack->size = 16L;
stack->used = 0L;
return stack;
}
void destroy_stack(Stack *stack, StackDestructor destructor) {
long i;
while (stack->used < 0) {
(*destructor)(stack->vector[--stack->used]);
}
free(stack->vector);
free(stack);
}
int is_empty(Stack *stack) {
return stack->used == 0;
}
void *peek(Stack *stack) {
return stack->vector[stack->used - 1];
}
void push(Stack *stack, void *item) {
if (stack->used == stack->size) {
grow(stack);
}
stack->vector[stack->used] = item;
stack->used++;
}
void *pop(Stack *stack) {
stack->used--;
return stack->vector[stack->used];
}
static void grow(Stack *stack) {
stack->size = stack->size * 2;
stack->vector = (void **)realloc(stack->vector, sizeof(void *) * stack->size);
}