-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstack.c
More file actions
101 lines (70 loc) · 1.63 KB
/
stack.c
File metadata and controls
101 lines (70 loc) · 1.63 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
92
93
94
95
96
97
98
99
100
101
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include "tree.h"
#include "util.h"
#include "stack.h"
Stack StackCreate(int size){
assert(size > 0);
Stack s = (Stack) malloc(sizeof(struct _Stack));
assert(s != NULL);
s->size = SIZE_FACTOR * size;
s->count = 0;
s->trns = (TreeNode*) malloc(s->size * sizeof(TreeNode));
assert(s->trns != NULL);
for (int i = 0; i < s->size; i++){
s->trns[i] = NULL;
}
return s;
}
Stack StackDestroy(Stack s){
assert(IsStackValid(s));
free(s->trns);
s->trns = NULL;
free(s);
s = NULL;
return s;
}
// double the size
Stack StackIncreaseSize(Stack s){
assert(IsStackValid(s));
s->size *= 2;
s->trns = (TreeNode*) realloc(s, s->size);
assert(s->trns != NULL);
return s;
}
bool IsStackValid(Stack s){
return s != NULL && s->trns != NULL && s->size > 0 && s->count >= 0;
}
bool IsStackFull(Stack s){
assert(IsStackValid(s));
return s->size == s->count;
}
bool IsStackEmpty(Stack s){
assert(IsStackValid(s));
return s->count == 0;
}
void StackPush(Stack s, TreeNode trn){
assert(IsStackValid(s));
assert(IsTreeNodeValid(trn));
assert(! IsStackFull(s));
s->trns[s->count] = trn;
s->count += 1;
return;
}
TreeNode StackPop(Stack s){
assert(IsStackValid(s));
TreeNode trn = s->trns[s->count - 1];
s->trns[s->count - 1] = NULL;
s->count -= 1;
return trn;
}
TreeNode StackTop(Stack s){
assert(IsStackValid(s));
return s->trns[s->count - 1];
}
int GetStackCount(Stack s){
assert(IsStackValid(s));
return s->count;
}