C와 C++의 스택(stack) 자료 구조
이 레슨에서는 C의 고정 배열과 C++의 std::stack으로 나중에 들어온 것이 먼저 나가는 스택 연산을 구현합니다.
소개
스택(stack)은 맨 위에서만 작업할 수 있습니다. push는 새 요소를 맨 위에 올리고, pop은 맨 위 요소를 꺼내며, peek는 맨 위 요소를 꺼내지 않고 확인합니다. 스택은 쌓아 둔 책처럼 나중에 들어온 것이 먼저 나가는 LIFO 규칙을 따릅니다.
핵심 정리
- 연산을 작성하기 전에 항상 참이어야 하는 조건(불변식)을 정하세요.
- 구조가 비어 있을 때, 가득 찼을 때, 메모리 할당에 실패했을 때를 처리하세요.
- 각 연산의 복잡도와 메모리 관리를 함께 따져 보세요.
동작 원리 보기
push와 pop을 해 보면 마지막에 넣은 항목이 항상 먼저 나온다는 것을 알 수 있습니다.
C와 C++ 코드 예제
C
main.c
#include <stdio.h>
typedef struct {
int data[8];
int size;
} Stack;
int push(Stack *stack, int value) {
if (stack->size == 8) return 0;
stack->data[stack->size++] = value;
return 1;
}
int pop(Stack *stack, int *value) {
if (stack->size == 0) return 0;
*value = stack->data[--stack->size];
return 1;
}
int main(void) {
Stack stack = {{0}, 0};
int value;
push(&stack, 10);
push(&stack, 20);
pop(&stack, &value);
printf("%d\n", value);
}
20
C++
main.cpp
#include <iostream>
#include <stack>
int main() {
std::stack<int> values;
values.push(10);
values.push(20);
std::cout << values.top() << '\n';
values.pop();
}
20
C와 C++ 비교
C 버전은 요소 8개짜리 고정 배열을 쓰므로, push할 때는 스택이 가득 찼는지(스택 오버플로), pop할 때는 비어 있는지 확인해야 합니다. C++의 std::stack은 내부 컨테이너로 용량을 관리하며, LIFO 규칙에 따라 같은 push, pop, top 연산을 제공합니다.
C
데이터(struct)와 연산이 분리되어 있고, 메모리는 직접 할당하고 해제합니다.
C++
클래스와 컨테이너가 데이터의 일관성을 지키고 자원을 스스로 관리합니다.
연습 문제
두 버전을 모두 실행한 다음 코드를 바꿔 보면서 각 언어가 주는 안전성의 차이를 살펴보세요.
- 비어 있는 상태와 최대 용량에 이른 순간에 대한 테스트를 추가해 보세요.
- 메모리 해제 코드를 작성하고 누수가 없는지 확인해 보세요.
- 표준 라이브러리의 같은 역할을 하는 컨테이너와 복잡도를 비교해 보세요.
챌린지로 연습하기
이 레슨에서 배운 내용으로 실제 문제를 풀어 보세요. 모든 챌린지는 브라우저에서 실행되며 즉시 테스트와 AI 리뷰를 받을 수 있습니다.
모든 챌린지