Stack (C 언어)

2021. 1. 30. 10:04알고리즘

C++ stack container 함수 정리 및

C stack 구현 예시

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

#define MAX_STACK_SIZE 1000
#define MAX_INPUT_SIZE 100

//stack에 들어갈 data 구조체
typedef struct {
    int xPos;
    int yPos;
} stackMemNode;

//stack 구조체
typedef struct {
    stackMemNode memory[MAX_STACK_SIZE];    //data가 저장될 배열
    int Top;    //stack의 top 위치를 가리키는 변수

} stack;

bool empty(stack *);
void pop(stack *);
void push(stack *, stackMemNode *);
size_t size(stack *);
stackMemNode *top(stack *);
void printStack(stack *);

int main(void)
{
    //stack 선언
    stack *st = (stack *)malloc(sizeof(stack));
    //stack의 memory 초기화
    for (int i = 0; i < MAX_STACK_SIZE; i++) {
        st->memory[i].xPos = -1;
        st->memory[i].yPos = -1;
    }
    st->Top = -1;

    //입력받은 명령어를 저장할 문자열
    char inputString[MAX_INPUT_SIZE];
    //push할 data는 여기에 저장해서 인자로 넘겨줌.
    stackMemNode *nodeData;
    //push 하기 위해 입력받은 data 임시 저장함.
    int temp;

    nodeData = (stackMemNode *)malloc(sizeof(stackMemNode));

    while (1) {
        printf("1.'empty'\n2.'pop'\n3.'push'\n4.'size'\n5.'top'\n6.'print'\n7.'exit'\n");
        printf("input order: ");
        scanf("%s", inputString); 
        nodeData->xPos = -1;
        nodeData->yPos = -1;

        //empty 명령이 들어올 때
        if (!strcmp(inputString, "empty")) {
            if (empty(st)) {
                printf("true\n");
            }
            else {
                printf("false\n");
            }
        }
        //pop 명령이 들어올 때
        else if (!strcmp(inputString, "pop")) {
            pop(st);
        }
        //push 명령이 들어올 때
        else if (!strcmp(inputString, "push")) {
            //stack에 들어갈 data 입력 받기
            printf("xPos: ");
            scanf("%d", &temp);
            nodeData->xPos = temp;

            printf("yPos: ");
            scanf("%d", &temp);
            nodeData->yPos = temp;

            push(st, nodeData);
        }
        //size 명령이 들어올 때
        else if (!strcmp(inputString, "size")) {
            printf("%zu\n", size(st));
        }
        //top 명령이 들어올 때
        else if (!strcmp(inputString, "top")) {
            nodeData = top(st);

            printf("xPos: %d, yPos: %d\n", nodeData->xPos, nodeData->yPos);
        }
        //print 명령이 들어올 때
        else if (!strcmp(inputString, "print")) {
            printStack(st);
        }
        else if (!strcmp(inputString, "exit")) {
            break;
        }
        //그 이외의 명령이 들어올 때
        else {
            printf("undefined order\n");
        }
        printf("\n");
    }

    free(nodeData);

    return 0;
}

bool empty(stack *st)
{
    if (st->Top == -1)    //stack이 비어있을 때
        return true;
    else
        return false;
}
void pop(stack *st)
{
    if (st->Top == -1)    //stack이 비어있어서 pop할 data가 없을 때
        return;

    st->memory[st->Top].xPos = -1;    //data를 -1로 초기화
    st->memory[st->Top].yPos = -1;
    st->Top--;    //data 개수가 하나 줄었으므로 top 1 감소

    return;
}
void push(stack *st, stackMemNode *node)
{
    st->Top++;    //data 개수가 하나 증가했으므로 top 1 증가
    st->memory[st->Top].xPos = node->xPos;    //data를 대입
    st->memory[st->Top].yPos = node->yPos;

    return;
}
size_t size(stack *st)
{
    return (size_t)(st->Top + 1);    //data가 배열에 저장되어 있어서 Top이 0부터 시작하므로 개수는 +1 해준다.
}
stackMemNode *top(stack *st)
{
    stackMemNode *pNode = malloc(sizeof(stackMemNode));    //구조체를 반환하기 위해서는 동적할당이 필요
    //stack이 비어있을 때
    if (st->Top == -1) {
        pNode->xPos = -1;
        pNode->yPos = -1;

        return pNode;
    }

    //top 위치의 값을 대입해서 반환
    pNode->xPos = st->memory[st->Top].xPos;
    pNode->yPos = st->memory[st->Top].yPos;

    return pNode;
}
void printStack(stack *st)    //stack 모든 data 출력
{
    for (int i = 0; i <= st->Top; i++) {
        printf("xPos: %d\tyPos: %d\n", st->memory[i].xPos, st->memory[i].yPos);
    }
    printf("\n");

    return;
}

'알고리즘' 카테고리의 다른 글

Priority Queue (최대 힙) (C 언어)  (0) 2021.02.21
Queue (C 언어)  (0) 2021.02.04