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