배열로 Stack 만들기 (C)

// 배열로 Stack 만들기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct stack {
    int top;
    int capacity;
    int* array;
} Stack;

Stack* createStack(int capacity) {
    Stack* stack = (Stack*)malloc(sizeof(Stack));
    memset(stack, 0, sizeof(Stack));
    stack->capacity = capacity;
    stack->top = -1;
    stack->array = (int *)malloc(stack->capacity*sizeof(int));
    memset(stack->array, 0, stack->capacity*sizeof(int));

    return stack;
}

int isFull(Stack* stack) {
    return stack->top == stack->capacity-1;
}

int isEmpty(Stack* stack) {
    return stack->top == -1;
}

void push(Stack* stack, int item) {
    if(isFull(stack)) {
        printf("stack이 꽉찼습니다.\\n");
        return;
    }
    stack->array[++stack->top] = item;
    printf("%d pushed to stack\\n", item);
}

int pop(Stack* stack) {
    if(isEmpty(stack)) {
        return -9999;
    }
    return stack->array[stack->top--];
}

// array에서 top이 가리키는 data를 단순히 반환하는 함수
int peek(Stack* stack) {
    if(isEmpty(stack)) {
        return -9999;
    }
    return stack->array[stack->top];
}

int main() {
    Stack* stack = createStack(100);

    push(stack, 10);
    push(stack, 20);
    push(stack, 30);
    push(stack, 40);

    printf("%d pop from stack\\n", pop(stack));
    printf("%d pop from stack\\n", pop(stack));

    push(stack, 50);
    printf("%d peeked from stack\\n", peek(stack));
    printf("%d pop from stack\\n", pop(stack));
    printf("%d pop from stack\\n", pop(stack));
    printf("%d pop from stack\\n", pop(stack));

    // 메모리 해제
    free(stack);

    return 0;
}

연결리스트로 Stack 만들기 (C)

// 연결리스트로 Stack 만들기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct stackNode {
    int data;
    struct stackNode* next;
} StackNode;

StackNode* createStackNode(int data) {
    StackNode* node = (StackNode*)malloc(sizeof(StackNode));
    memset(node, 0, sizeof(StackNode));
    node->data = data;
    node->next = NULL;
    return node;
}

int isEmpty(StackNode* root) {
    return !root;
}

void push(StackNode** root, int data) {
    if(*root == NULL) {
        *root = createStackNode(data);
        printf("%d pushed to stack\\n", data);
    } else {
        StackNode* node = (StackNode*)malloc(sizeof(StackNode));
        memset(node, 0, sizeof(StackNode));
        node->data = data;
        node->next = *root;
        *root = node;
        printf("%d pushed to stack\\n", data);
    }
}

int pop(StackNode** root) {
    // stack이 비었을 때
    if (isEmpty(*root))
        return -9999;
    int popped;
    popped = (*root)->data;
    *root = (*root)->next;
    return popped;
}

int peek(StackNode** root) {
    if (isEmpty(*root))
        return -9999;
    return (*root)->data;
}

int main() {
    StackNode* root = NULL;

    push(&root, 10);
    push(&root, 20);
    push(&root, 30);
    push(&root, 40);

    printf("%d pop from stack\\n", pop(&root));
    printf("%d pop from stack\\n", pop(&root));

    push(&root, 50);
    printf("%d peeked from stack\\n", peek(&root));
    printf("%d pop from stack\\n", pop(&root));
    printf("%d pop from stack\\n", pop(&root));
    printf("%d pop from stack\\n", pop(&root));

    return 0;
}