view src/SingleLinkedStack.cbc @ 265:f9169495d476

order log calc
author tobaru
date Sun, 26 Jan 2020 18:20:40 +0900
parents 822d74c14f38
children
line wrap: on
line source

#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(...);
    }
}