C언어로 스택 구현

민픽minpic·2023년 5월 6일
0

[TIL] Today I Learned

목록 보기
13/25

씹어먹는 C에 대한 내용을 한번 쭉 보고, C언어 연습 겸 스택을 구현해보았다.
지금까지는 직접 자료구조를 만들어서 써본 경험이 많지 않았는데,
이번 기회에 자료구조에 대한 기초를 쌓을 수 있는 좋은 기회인 것 같아서 진행했다.

스택을 구현하기 위해서는 여러 방법이 있었다.
나는 Stack struct를 만들어서 필요한 메모리 만큼 동적할당하여 사용하려고 한다.

해당 스택을 구현하면서 만났던 에러는 Segmentation Fault 였다.

코드를 보면서 곰곰히 생각해보니, 동적할당을 해줬는데 해제를 안해줬었다. 그래서 메모리 해제 함수를 만들어서 해제해주었다.

하지만 문제는 해결되지 않고 계속 해당 에러가 나타났다.
그리고 다시 곰곰히 생각해보니까, stack.h 를 Makefile에 의존성을 설정해주지 않았었다. 그래서 의존성을 설정하여 다시 실행시켰더니, 원했던 결과물이 나왔다.

그리고 정말 학부시절 이후에 처음으로 C를 써봐서 아직 구조체,포인터,동적메모리할당 이 세가지를 동시에 구현하고 사용하는게 어려운 것 같다.

큐와 링크드리스트도 C로 구현해보면서 감을 익혀야 할 것 같다.
아래는 C로 작성한 스택 구현 코드이다.

# stack.h

# typedef 로 struct Stack 대신 Stack 으로 사용할 수 있도록 별명지정
typedef struct Stack {
    int *data;      # 데이터
    int top;        # 몇번째 인덱스가 top인지 확인하는 용도 
    int max;        # 스택의 크기
}Stack;

# 새로운 스택 할당
Stack *newstack(int capa);

# 스택이 비어있는지 확인
int is_empty(Stack *arr);

# 스택이 차 있는지 확인
int is_full(Stack *arr);

# 스택에 데이터 push
void push(Stack *arr, int data);

# 스택에 데이터 pop
int pop(Stack *arr);

# 스택 동적메모리 할당 해제
void free_stack(Stack *arr);

새로운 스택을 할당 및 해제 함수

Stack *newstack(int capa){
    Stack *arr = (Stack*) malloc(sizeof(Stack));
    arr->max = capa;
    arr->top = -1;
    arr->data = (int *)malloc(sizeof(int) * capa);
    return arr;
}

void free_stack(Stack *arr) {
    if (arr) {
        if (arr->data) {
            free(arr->data);
        }
        free(arr);
    }
}

스택이 비어있는지 차있는지 확인하는 함수

int is_empty(Stack *arr){
    if (arr->top == -1) {
        return 1;
    }
    return 0;
}

int is_full(Stack *arr){
    if (arr->top == (arr->max)-1){
        return 1;
    }   
    return 0;
}

스택 push pop 함수

void push(Stack *arr, int data){
    if (is_full(arr)) {
        printf("stack is FULL!");
        return;
    }
    arr->top++;
    arr->data[arr->top] = data;
}

int pop(Stack *arr) {
    if (is_empty(arr)){
        printf("stack is empty!");
        return 0 ;
    }
    int value = arr->data[arr->top];
    arr->top--;
    return value;
} 
profile
사진찍는 개발자 / 한 가지 개념이라도 깊이있게

0개의 댓글