-
Notifications
You must be signed in to change notification settings - Fork 0
/
stack.c
125 lines (109 loc) · 2.24 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
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "stack.h"
#include "node.h"
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
// Description:
// A struct for the Stack ADT.
//
// Members:
// uint32_t top - Index of the next empty slot in the stack.
// uint32_t capacity - Capacity of the stack.
// Node **items - Holds the items.
struct Stack {
uint32_t top;
uint32_t capacity;
Node **items;
};
// Description:
// Initializes a stack with a specified capacity.
//
// Parameters:
// uint32_t capacity - The max capacity of the stack.
//
// Returns:
// Stack * - A pointer to the newly initialized stack.
Stack *stack_create( uint32_t capacity ) {
Stack *s = ( Stack * ) malloc( sizeof( Stack ) );
if ( s ) {
s->top = 0;
s->capacity = capacity;
s->items = malloc( capacity * sizeof( Node * ) );
if ( !s->items ) {
free( s );
s = NULL;
}
}
return s;
}
// Description:
// Frees the memory given to a stack.
//
// Parameters:
// Stack **s - A pointer to a pointer to the stack to free the memory of.
//
// Returns:
// Nothing.
void stack_delete( Stack **s ) {
if ( *s && ( *s )->items ) {
free( ( *s )->items );
free( *s );
*s = NULL;
}
}
// Description:
// Checks if a stack is empty.
//
// Parameters:
// Stack *s - The stack to check.
//
// Returns:
// bool - Whether the stack is empty.
bool stack_empty( Stack *s ) {
return s->top == 0;
}
// Description:
// Checks if a stack is full.
//
// Parameters:
// Stack *s - The stack to check.
//
// Returns:
// bool - Whether the stack is full.
bool stack_full( Stack *s ) {
return s->top == s->capacity;
}
// Description:
// Pushes a node to a stack.
//
// Parameters:
// Stack *s - The stack to push to.
// Node *n - The node to push to the stack.
//
// Returns:
// bool - Whether the operation was successful.
bool stack_push( Stack *s, Node *n ) {
if ( stack_full( s ) ) {
return false;
}
s->items[ s->top ] = n;
s->top++;
return true;
}
// Description:
// Pops a node from a stack.
//
// Parameters:
// Stack *s - The stack to pop from.
// Node **x - A pointer to a pointer to a Node to set the popped node to.
//
// Returns:
// bool - Whether the operation was successful.
bool stack_pop( Stack *s, Node **n ) {
if ( stack_empty( s ) ) {
return false;
}
s->top--;
*n = s->items[ s->top ];
return true;
}