#include "../context.h" #interface "Stack.h" Stack* createSingleLinkedStack(struct Context* cbc_context) { struct Stack* stack = new Stack(); struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack(); stack->stack = (union Data*)singleLinkedStack; singleLinkedStack->top = NULL; stack->push = C_pushSingleLinkedStack; stack->pop = C_popSingleLinkedStack; stack->pop2 = C_pop2SingleLinkedStack; stack->get = C_getSingleLinkedStack; stack->get2 = C_get2SingleLinkedStack; stack->isEmpty = C_isEmptySingleLinkedStack; stack->clear = C_clearSingleLinkedStack; return stack; } void printStack1(union Data* data) { struct Node* node = &data->Element.data->Node; // if (node == NULL) { // printf("NULL"); // } else { // printf("key = %d ,", node->key); // printStack1((union Data*)data->Element.next); // } } void printStack(union Data* data) { printStack1(data); // printf("\n"); } __code clearSingleLinkedStack(struct SingleLinkedStack* stack,__code next(...)) { stack->top = NULL; goto next(...); } __code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) { Element* element = new Element(); element->next = stack->top; element->data = data; stack->top = element; goto next(...); } __code popSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) { if (stack->top) { data = stack->top->data; stack->top = stack->top->next; } else { data = NULL; } goto next(data, ...); } __code pop2SingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, union Data* data1, ...)) { if (stack->top) { data = stack->top->data; stack->top = stack->top->next; } else { data = NULL; } if (stack->top) { data1 = stack->top->data; stack->top = stack->top->next; } else { data1 = NULL; } goto next(data, data1, ...); } __code getSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) { if (stack->top) data = stack->top->data; else data = NULL; goto next(data, ...); } __code get2SingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, union Data* data1, ...)) { if (stack->top) { data = stack->top->data; if (stack->top->next) { data1 = stack->top->next->data; } else { data1 = NULL; } } else { data = NULL; data1 = NULL; } goto next(data, data1, ...); } __code isEmptySingleLinkedStack(struct SingleLinkedStack* stack, __code next(...), __code whenEmpty(...)) { if (stack->top) { goto next(...); } else { goto whenEmpty(...); } }