-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstack.c
More file actions
70 lines (57 loc) · 1.32 KB
/
stack.c
File metadata and controls
70 lines (57 loc) · 1.32 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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "stack.h"
LSStack *LSStackCreate()
{
LSStack *newStack = malloc(sizeof(LSStack));
LSRetainCounter *retainCounter = LSCreateRetainCounter();
LSBaseObject *base = (LSBaseObject*) newStack;
base->counter = retainCounter;
return newStack;
}
int LSIsEmpty(LSStack *self)
{
LSStack *currentStack = self;
LSRetain(currentStack);
if(!self) {
LSRelease(currentStack);
return 1;
} else if(!currentStack->top) {
LSRelease(currentStack);
return 1;
} else {
LSRelease(currentStack);
return 0;
}
}
void LSPush(LSStack *self, LSBaseObject *anything)
{
LSStack *currentStack = self;
LSRetain(currentStack);
LSNode *node = LSNodeCreate(anything);
node->next = (LSBaseObject*) currentStack->top;
currentStack->top = node;
LSRelease(currentStack);
}
LSBaseObject *LSPop(LSStack *self)
{
LSStack *currentStack = self;
LSRetain(currentStack);
LSNode *node = currentStack->top;
LSRetain(node);
currentStack->top = (LSNode *) node->next;
LSRelease(currentStack);
LSRelease(node);
return node->value;
}
LSBaseObject *LSPeek(LSStack *self)
{
LSStack *currentStack = self;
LSRetain(currentStack);
LSNode *node = currentStack->top;
LSRetain(node);
LSRelease(currentStack);
LSRelease(node);
return node->value;
}