-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstack.c
More file actions
135 lines (119 loc) · 2.59 KB
/
stack.c
File metadata and controls
135 lines (119 loc) · 2.59 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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "stack.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.
// int64_t *items - Holds the items.
struct Stack {
uint32_t top;
uint32_t capacity;
int64_t *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 ) { // Make sure the memory allocated successfully to the struct.
s->top = 0;
s->capacity = capacity;
s->items = ( int64_t * ) calloc( capacity, sizeof( int64_t ) );
if ( !s->items ) { // s->items could not be allocated memory.
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 ) { // Make sure the stack wasn't already deleted.
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:
// Checks the size of a stack.
//
// Parameters:
// Stack *s - The stack to check.
//
// Returns:
// uint32_t - The size of the stack.
uint32_t stack_size( Stack *s ) {
return s->top;
}
// Description:
// Pushes a value to a stack.
//
// Parameters:
// Stack *s - The stack to push to.
// int64_t x - The value to push to the stack.
//
// Returns:
// bool - Whether the operation was successful.
bool stack_push( Stack *s, int64_t x ) {
if ( stack_full( s ) ) {
return false;
}
s->items[ s->top ] = x;
s->top++;
return true;
}
// Description:
// Pops a value from a stack.
//
// Parameters:
// Stack *s - The stack to pop from.
// int64_t *x - A pointer to a int64_t to set the popped value to.
//
// Returns:
// bool - Whether the operation was successful.
bool stack_pop( Stack *s, int64_t *x ) {
if ( stack_empty( s ) ) {
return false;
}
*x = s->items[ s->top - 1 ];
s->top--;
return true;
}