본문 바로가기

TEST/자료구조와 함께 배우는 알고리즘 입문(C언어)

<4> Q2. 자료구조와 함께 배우는 알고리즘 입문 (C언어)

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int MAX;
    int A;
    int B;
    int *stk;
} IntStack;

int A_PUSH(IntStack *s, int x)
{
    if (s->A >= s->B)
    {
        printf("fail");
        return -1;
    }
    s->stk[s->A++] = x;

    return 0;
}

int B_PUSH(IntStack *s, int x)
{
    if (s->A >= s->B)
    {
        printf("fail");
        return -1;
    }
    s->stk[s->B--] = x;

    return 0;
}

int A_POP(IntStack *s, int *x)
{
    if (s->A <= 0)
    {
        printf("fail");
        return -1;
    }
    *x = s->stk[--s->A];
    s->stk[s->A] = 0;
    return 0;
}

int B_POP(IntStack *s, int *x)
{
    if (s->B >= s->MAX - 1)
    {
        printf("fail");
        return -1;
    }
    *x = s->stk[++s->B];
    s->stk[s->B] = 0;
    return 0;
}

int PrintStack(IntStack *s)
{
    for (int i = 0; i < s->MAX; i++)
    {
        printf("%d ", s->stk[i]);
    }
    printf("\n");
    return 0;
}

int main(void)
{
    int temp, input;
    IntStack a;
    printf("Input MAX : ");
    scanf("%d", &temp);
    a.MAX = temp;
    a.A = 0;
    a.B = temp - 1;
    a.stk = (int *)calloc(a.MAX, sizeof(int));

    while (1)
    {
        printf("1.PUSA_A, 2.PUSB_B, 3.POP_A, 4.POP_B, 5.Print Stack, 6.Exit : ");
        scanf("%d", &input);

        switch (input)
        {
        case 1:
            printf("PUSH NUMBER : ");
            scanf("%d", &input);
            A_PUSH(&a, input);
            break;
        case 2:
            printf("PUSH NUMBER : ");
            scanf("%d", &input);
            B_PUSH(&a, input);
            break;
        case 3:
            A_POP(&a, &temp);
            printf("POP NUMBER : %d\n", temp);
            break;
        case 4:
            B_POP(&a, &temp);
            printf("POP NUMBER : %d\n", temp);
            break;
        case 5:
            PrintStack(&a);
            break;
        case 6:
            return 0;
        }
    }
}