-
Notifications
You must be signed in to change notification settings - Fork 0
/
stackADT.c
132 lines (110 loc) · 2.23 KB
/
stackADT.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
126
127
128
129
130
131
132
/*
* A memory-efficient Stack data structure that handles all data and memory operations
* without memory leaks.
*
* Adapted from a school project.
*
* Eric Wang
*/
#include <stdio.h>
#include <stdlib.h>
#ifdef IMP
#else
#include "stackADT.h"
#endif
struct node {
void * data;
struct node *next;
};
struct stack_type {
struct node *top;
};
static void terminate(const char *message){
printf("%s\n", message);
exit(EXIT_FAILURE);
}
Stack Stack_create(void){
Stack s = malloc(sizeof(struct stack_type));
if(s == NULL){
terminate("Create error: Stack could not be created.");
}
s->top = NULL;
return s;
}
void Stack_destroy(Stack s){
Stack_make_empty(s);
free(s);
}
void Stack_make_empty(Stack s){ // FREE THE DATA HERE!
while(!Stack_is_empty(s)){
void * s_ptr = Stack_pop(s);
free(s_ptr);
}
}
bool Stack_is_empty(Stack s){
return s->top == NULL;
}
bool Stack_is_full(Stack s){ // ?
return false;
}
void Stack_push(Stack s, void * i){
struct node *new_node = malloc(sizeof(struct node));
if(new_node == NULL){
terminate("Push error: Stack is full.");
}
new_node->data = i;
new_node->next = s->top;
s->top = new_node;
}
void * Stack_pop(Stack s){
struct node *old_top;
void * i;
if(Stack_is_empty(s)){
return NULL;
}
old_top = s->top;
i = old_top->data;
s->top = old_top->next;
free(old_top);
return i;
}
void * Stack_peek(Stack s){
void * i;
if(Stack_is_empty(s)){
terminate("Peek error: Stack is empty.");
}
i = s->top->data;
return i;
}
// BELOW FUNCTIONS COME FROM DISCUSSION 9
void print_char_back(struct node *n_ptr)
{
if (n_ptr == NULL)
{
printf("NULL");
return;
}
print_char_back(n_ptr->next);
printf("<-%c", *((char *)n_ptr->data));
}
void Stack_char_print(Stack s)
{
print_char_back(s->top);
printf("<-top\n");
}
// for dataStack
void print_int_back(struct node *n_ptr)
{
if (n_ptr == NULL)
{
printf("NULL");
return;
}
print_int_back(n_ptr->next);
printf("<-%d", *((int *)n_ptr->data));
}
void Stack_int_print(Stack s)
{
print_int_back(s->top);
printf("<-top\n");
}