크래프톤 정글

스택(Stack) 구현 (C언어) : Part.2 - push, pop, free_stack, peek구현

고웅 2025. 4. 16. 19:26

본격적인 스택 구현의 첫 시간이다. 우리는 push, pop, free_stack, peek을 구현해 볼 것이다. 만약 같이 따라 해볼 예정이라면 이전 환경설정 포스트를 확인하는 것을 추천한다.

2025.04.16 - [크래프톤 정글] - 스택(Stack) 구현 (C언어) : Part.1 - 초기 환경 설정 & 구현할 함수 소개

 

스택(Stack) 구현 (C언어) : Part.1 - 초기 환경 설정 & 구현할 함수 소개

이번에는 C언어를 이용해 스택을 직접 구현해보려고 한다. 링크드 리스트를 직접 구현했던 내용도 있으니 링크드 리스트에 대해서 부족하지만 정리했던 내용을 확인하려면 이 전 포스팅 했던

www.gowoong.com


1. 구현 목표

  • init_stack : 스택의 값을 초기화 한다. (보너스)
  • push : 스택에 값을 삽입한다.
  • pop : 스택의 top 값을 뽑아낸다.
  • free_stack : 스택 전체를 초기화 한다.
  • peek : 스택의 top에 있는 값을 출력한다.
  • is_empty: 스택이 비어있는지 확인한다.

2. 기능 구현

🔨 init_stack

init_stack 이란 사실 매우 별것 없다. 그저 stack의 값을 초기화하는 데 그치는 함수이다.

void init_stack(Stack* stack) {
    stack->top = NULL;
}

🔨 push

push 함수는 스택에 새로운 노드 값을 추가하는 함수이다.

구현 아이디어 

  1. 스택에 추가할 새로운 노드를 만든다.
  2. 새로운 노드에 data를 추가한다.
  3. 스택 노드의 다음 값에 현재 스택의 top 이 가리키는 노드를 연결한다.
  4. 스택의 top 값을 새로 만든 노드에 연결한다.
void push(Stack *stack, int data) {
    StackNode *newNode = (StackNode *)malloc(sizeof(StackNode));
    if (!newNode) return;
    newNode->data = data;
    newNode->next = stack->top;
    stack->top = newNode;
}

생각보다 간단하다. 스택이란 게 결국 새로 들어간 값이 먼저 나와야 하니 기존 스택에 있던 값의 제일 앞에 새로운 노드를 만들어 계속 연결하면 된다.

🔨 pop

pop 함수는 스택의 top 값을 뽑아내면 된다. 이때 뽑아진 노드는 꼭 free로 메모리를 수거해야 한다.

구현 아이디어

  1. 현재 스택이 비어있는지 확인하고 비어 있다면 스택이 비었다는 출력과 -1을 반환한다.
  2. 링크드리스트의 삭제에서 경험해 봤듯 temp 노드를 만든다.
  3. data라는 int 형 변수를 만들고 현재 스택의 top 노드가 가지고 있던 데이터를 저장한다.
  4. 스택의 top 노드 값을 현재 스택 top 노드의 next 값으로 연결한다.
  5. temp를 free로 메모리 해제를 한다.
  6. int 데이터를 반환한다.
int pop(Stack *stack) {
    if (is_empty(stack)) {
        printf("stack empty\n");
        return -1;
    }
    StackNode* temp = stack->top;
    int data = temp->data;
    stack->top = stack->top->next;
    free(temp);
    return data;
}

🔨 free_stack

삭제와 관련된 기능에는 temp라는 노드 변수를 이용한다.

구현 아이디어

  1. cur 변수에 스택의 top 값을 저장한다.
  2. while 반복을 한다.
  3. temp를 만들고 cur값을 저장한다.
  4. cur에 cur->next 노드를 지정한다.
  5. free로 temp를 해제한다.
  6. 스택의 top 값을 NULL로 지정한다.
void free_stack(Stack *stack) {
    StackNode* cur = stack->top;
    while (cur != NULL) {
        StackNode* temp = cur;
        cur = cur->next;
        free(temp);
    }
    stack->top = NULL;
}

🔨 peek

peek은 스택의 top에 있는 data의 값을 출력하는 함수이다.

구현 아이디어

  1. 스택이 비어있는 경우 스택이 비어있다는 출력과 최소 값을 반환한다.
  2. 스택의 top 노드의 data를 반환한다.
int peek(Stack *stack) {
    if (is_empty(stack)) {
        printf("Stack is empty\n");
        return INT8_MIN;
    }
    return stack->top->data;
}

🔨 is_empty

is_empty는 현재 스택이 비어있는지 확인하는 함수이다. 간단하게 스택이 NULL인지 그리고 stack의 top 이 NULL인지 확인한 뒤 그 결과를 1, 0으로 반환한다.

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

3. 기능 검증

테스트 코드 실행 결과가 아래와 같이 나오면 구현에 성공한 것이다.

▶ Running test_push_and_peek...
✅ Passed test_push_and_peek (0.03 ms)

▶ Running test_pop...
✅ Passed test_pop (0.00 ms)

▶ Running test_pop_on_empty_stack...
stack empty
✅ Passed test_pop_on_empty_stack (0.00 ms)

========================================
Tests run: 3
Tests passed: 3
Tests failed: 0
✅ ALL TESTS PASSED