Mercurial > hg > CbC > CbC_xv6
comparison src/SingleLinkedStack.cbc @ 80:c976a8bbe8c5
add stac.h and Stac.cbc
author | tobaru |
---|---|
date | Wed, 09 Oct 2019 20:41:51 +0900 |
parents | |
children | d419660ad71d |
comparison
equal
deleted
inserted
replaced
76:e6043075a1aa | 80:c976a8bbe8c5 |
---|---|
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 |