본격적인 스택 구현의 첫 시간이다. 우리는 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 함수는 스택에 새로운 노드 값을 추가하는 함수이다.
구현 아이디어
- 스택에 추가할 새로운 노드를 만든다.
- 새로운 노드에 data를 추가한다.
- 스택 노드의 다음 값에 현재 스택의 top 이 가리키는 노드를 연결한다.
- 스택의 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을 반환한다.
- 링크드리스트의 삭제에서 경험해 봤듯 temp 노드를 만든다.
- data라는 int 형 변수를 만들고 현재 스택의 top 노드가 가지고 있던 데이터를 저장한다.
- 스택의 top 노드 값을 현재 스택 top 노드의 next 값으로 연결한다.
- temp를 free로 메모리 해제를 한다.
- 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라는 노드 변수를 이용한다.
구현 아이디어
- cur 변수에 스택의 top 값을 저장한다.
- while 반복을 한다.
- temp를 만들고 cur값을 저장한다.
- cur에 cur->next 노드를 지정한다.
- free로 temp를 해제한다.
- 스택의 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의 값을 출력하는 함수이다.
구현 아이디어
- 스택이 비어있는 경우 스택이 비어있다는 출력과 최소 값을 반환한다.
- 스택의 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
'크래프톤 정글' 카테고리의 다른 글
RB-Tree 구현하기 (C언어) - Part.1 설명 및 뼈대 구현 (0) | 2025.04.20 |
---|---|
스택(Stack) 구현 (C언어) : Part.3 - get_size, reverse, copy 구현 (0) | 2025.04.16 |
스택(Stack) 구현 (C언어) : Part.1 - 초기 환경 설정 & 구현할 함수 소개 (0) | 2025.04.16 |
링크드리스트(LinkedList) 구현 (C언어) : Part.6 - 수정 및 회고 (0) | 2025.04.16 |
링크드리스트(LinkedList) 구현 (C언어) : Part.5 - reverse_list, sort_list (0) | 2025.04.16 |