80
|
1 #include "../context.h"
|
|
2 #interface "Stack.h"
|
|
3
|
|
4 // typedef struct SingleLinkedStack {
|
|
5 // struct Element* top;
|
|
6 // } SingleLinkedStack;
|
|
7
|
|
8 Stack* createSingleLinkedStack(struct Context* context) {
|
|
9 struct Stack* stack = new Stack();
|
|
10 struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack();
|
|
11 stack->stack = (union Data*)singleLinkedStack;
|
|
12 singleLinkedStack->top = NULL;
|
|
13 stack->push = C_pushSingleLinkedStack;
|
|
14 stack->pop = C_popSingleLinkedStack;
|
|
15 stack->pop2 = C_pop2SingleLinkedStack;
|
|
16 stack->get = C_getSingleLinkedStack;
|
|
17 stack->get2 = C_get2SingleLinkedStack;
|
|
18 stack->isEmpty = C_isEmptySingleLinkedStack;
|
|
19 stack->clear = C_clearSingleLinkedStack;
|
|
20 return stack;
|
|
21 }
|
|
22
|
|
23 void printStack1(union Data* data) {
|
|
24 struct Node* node = &data->Element.data->Node;
|
|
25 // if (node == NULL) {
|
|
26 // printf("NULL");
|
|
27 // } else {
|
|
28 // printf("key = %d ,", node->key);
|
|
29 // printStack1((union Data*)data->Element.next);
|
|
30 // }
|
|
31 }
|
|
32
|
|
33 void printStack(union Data* data) {
|
|
34 printStack1(data);
|
|
35 // printf("\n");
|
|
36 }
|
|
37
|
|
38 __code clearSingleLinkedStack(struct SingleLinkedStack* stack,__code next(...)) {
|
|
39 stack->top = NULL;
|
|
40 goto next(...);
|
|
41 }
|
|
42
|
|
43 __code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) {
|
|
44 Element* element = new Element();
|
|
45 element->next = stack->top;
|
|
46 element->data = data;
|
|
47 stack->top = element;
|
|
48 goto next(...);
|
|
49 }
|
|
50
|
|
51 __code popSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) {
|
|
52 if (stack->top) {
|
|
53 data = stack->top->data;
|
|
54 stack->top = stack->top->next;
|
|
55 } else {
|
|
56 data = NULL;
|
|
57 }
|
|
58 goto next(data, ...);
|
|
59 }
|
|
60
|
|
61 __code pop2SingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, union Data* data1, ...)) {
|
|
62 if (stack->top) {
|
|
63 data = stack->top->data;
|
|
64 stack->top = stack->top->next;
|
|
65 } else {
|
|
66 data = NULL;
|
|
67 }
|
|
68 if (stack->top) {
|
|
69 data1 = stack->top->data;
|
|
70 stack->top = stack->top->next;
|
|
71 } else {
|
|
72 data1 = NULL;
|
|
73 }
|
|
74 goto next(data, data1, ...);
|
|
75 }
|
|
76
|
|
77
|
|
78 __code getSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) {
|
|
79 if (stack->top)
|
|
80 data = stack->top->data;
|
|
81 else
|
|
82 data = NULL;
|
|
83 goto next(data, ...);
|
|
84 }
|
|
85
|
|
86 __code get2SingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, union Data* data1, ...)) {
|
|
87 if (stack->top) {
|
|
88 data = stack->top->data;
|
|
89 if (stack->top->next) {
|
|
90 data1 = stack->top->next->data;
|
|
91 } else {
|
|
92 data1 = NULL;
|
|
93 }
|
|
94 } else {
|
|
95 data = NULL;
|
|
96 data1 = NULL;
|
|
97 }
|
|
98 goto next(data, data1, ...);
|
|
99 }
|
|
100
|
|
101 __code isEmptySingleLinkedStack(struct SingleLinkedStack* stack, __code next(...), __code whenEmpty(...)) {
|
|
102 if (stack->top) {
|
|
103 goto next(...);
|
|
104 } else {
|
|
105 goto whenEmpty(...);
|
|
106 }
|
|
107 }
|
|
108
|
|
109
|