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