루리코딩 세상

자료구조 스택(Stack) 완전 정리 – 개념부터 예제까지 본문

이론/자료구조

자료구조 스택(Stack) 완전 정리 – 개념부터 예제까지

루리딩 2025. 5. 19. 07:19

Chat - GTP 활용해서 작성된 문서입니다. 더블체크 필수


 

안녕하세요! 오늘은 자료구조의 기초 하나인 스택(Stack) 대해 알아보려고 합니다.
프로그래밍을 처음 배우는 분들이나 면접 준비 중이신 분들에게도 필요한 내용이니, 함께 차근차근 배워보아요 😊


🧱 스택이란?

스택(Stack) 데이터를 쌓아 올린 구조의미하며, "후입선출(Last-In, First-Out)" 방식으로 작동합니다.

마지막에 넣은 데이터가 가장 먼저 나간다! 🍔 햄버거 포장지, 접시 쌓기처럼요.

 

스택의 주요 기능

push(item) 데이터를 스택에 추가 (맨 위에 쌓기)
pop() 가장 위에 있는 데이터를 꺼내기 (제거)
peek() 또는 top() 가장 위 데이터를 확인 (제거하지 않음)
isEmpty() 스택이 비어 있는지 확인
size() 스택에 있는 데이터 개수 확인

🖼️ 스택 구조 예시

[ Top ]
   🍎 ← push(apple)
   🍌 ← push(banana)
   🍇 ← push(grape)
    • pop() → 🍇
    • peek() → 🍌
    • 이후 스택: 🍎, 🍌

💻 C언어로 스택(Stack) 구현하기

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

#define MAX_SIZE 100  // 스택의 최대 크기

// 스택 구조체 정의
typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

// 스택 초기화
void init(Stack* s) {
    s->top = -1;
}

// 스택이 비어있는지 확인
int isEmpty(Stack* s) {
    return s->top == -1;
}

// 스택이 가득 찼는지 확인
int isFull(Stack* s) {
    return s->top == MAX_SIZE - 1;
}

// 스택에 데이터 추가 (push)
void push(Stack* s, int value) {
    if (isFull(s)) {
        printf("스택이 가득 찼습니다!\n");
        return;
    }
    s->data[++(s->top)] = value;
}

// 스택에서 데이터 꺼내기 (pop)
int pop(Stack* s) {
    if (isEmpty(s)) {
        printf("스택이 비어 있습니다!\n");
        return -1;
    }
    return s->data[(s->top)--];
}

// 스택의 맨 위 데이터 확인 (peek)
int peek(Stack* s) {
    if (isEmpty(s)) {
        printf("스택이 비어 있습니다!\n");
        return -1;
    }
    return s->data[s->top];
}

// 스택 사용 예제
int main() {
    Stack stack;
    init(&stack);

    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);

    printf("Top of stack: %d\n", peek(&stack));  // 30 출력

    printf("Pop: %d\n", pop(&stack));  // 30 제거
    printf("Pop: %d\n", pop(&stack));  // 20 제거

    printf("Top of stack: %d\n", peek(&stack));  // 10 출력

    return 0;
}

📌 코드 설명

init 스택을 초기화 (top을 -1로 설정)
push top을 1 증가시키고 값 저장
pop top 위치의 값을 반환 후 top 감소
peek 현재 top 위치의 값 확인 (제거는 안 함)
isEmpty / isFull 상태 확인용 함수

 

💻 파이썬으로 구현해 보기

class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()
        return None

    def peek(self):
        if not self.is_empty():
            return self.items[-1]
        return None

    def is_empty(self):
        return len(self.items) == 0

    def size(self):
        return len(self.items)

# 사용 예시
stack = Stack()
stack.push('apple')
stack.push('banana')
print(stack.pop())    # banana
print(stack.peek())   # apple

🎯 스택이 쓰이는 예시

브라우저 뒤로 가기 방문한 페이지가 스택에 쌓여 있음
함수 호출 함수가 호출될 때마다 스택에 저장 (Call Stack)
괄호 검사 여는 괄호는 push, 닫는 괄호는 pop으로 검사
DFS (깊이 우선 탐색) 노드 방문 순서 추적에 사용
 

스택 사용 주의할

  • 너무 많은 데이터를 쌓으면 Stack Overflow (스택 오버플로우) 발생 가능
  • pop() 하기 전에 isEmpty() 확인 필수!

📌 마무리하며

스택은 자료구조 중에서도 매우 기초적이지만 다양한 문제 해결에 활용되는 아주 중요한 구조입니다.
자료구조나 알고리즘을 공부할 스택의 개념을 탄탄히 잡아두면 분명 도움이 거예요.

 

궁금한 점이나 이해가 되는 부분이 있다면 댓글로 남겨주세요. 같이 찾아보겠습니다.