Skip to main content

Command Palette

Search for a command to run...

[Python 자료구조] Stack(스택)

Updated
3 min readView as Markdown
K

I'm currently learning Python and studying RAG (Retrieval-Augmented Generation).

스택 정의, 값 넣기/빼기

프로그래밍을 처음 접할 때 나오는 대표적인 자료구조 중 하나가 바로 스택(Stack) 이다. 이름만 들으면 어렵게 느껴질 수 있지만, 실제로는 우리 일상에서도 쉽게 찾아볼 수 있는 개념이다. 예를 들어 젠가(Jenga) 게임을 떠올려보자.


스택이란? 젠가로 이해하는 Stack의 원리

젠가 블럭을 하나씩 통에 넣고 꺼내는 상황을 상상해보자. 가장 최근에 넣은 블럭은 통의 가장 위에 쌓이게 된다. 그리고 꺼내고자 할 때도 맨 위의 블럭부터 꺼낼 수밖에 없다. 만약 맨 아래에 있는 블럭이 필요하다면? 위에 있는 블럭들을 먼저 전부 꺼내야 한다.

이처럼 가장 나중에 들어간 데이터가 가장 먼저 나오는 구조를 우리는 후입선출(Last In, First Out, LIFO) 이라고 부른다. 스택은 바로 이 LIFO 원리를 따르는 대표적인 자료구조이다.

Stack의 기본 연산 5가지

스택은 마치 블럭을 차곡차곡 쌓고 꺼내는 것처럼, 다음과 같은 다섯 가지 주요 기능을 갖는다.

함수명설명
push(x)데이터 x를 스택의 맨 위에 쌓는다.
pop()스택의 맨 위에 있는 데이터를 제거하고, 그 값을 반환한다.
top()스택의 맨 위에 있는 데이터를 제거하지 않고 값을 확인한다.
size()현재 스택에 쌓여 있는 데이터 개수를 반환한다.
empty()스택이 비어 있다면 True, 아니면 False를 반환한다.

리스트로 표현

stack = []

# 데이터 삽입
stack.append(5)   # push(5)
stack.append(10)  # push(10)

# 데이터 확인 및 제거
print(stack[-1])  # top() → 10
print(stack.pop())  # pop() → 10

# 스택 상태
print(len(stack))  # size() → 1
print(not stack)   # empty() → False

Stack의 시간복잡도

스택에서 데이터를 삽입하거나 삭제하는 연산은 모두 맨 위에서만 일어나기 때문에, 시간복잡도는 평균적으로 O(1) 이다. 즉, 매우 빠른 속도로 데이터를 처리할 수 있다는 장점이 있다.


🧱 Python으로 Stack 자료구조 직접 구현하기

✨ Python에는 Stack이 없다?

Python은 내장 자료구조로 리스트(list)를 제공하지만, Stack이라는 별도의 클래스는 없다.
그래서 Stack을 사용하려면, Stack을 직접 만들어야 한다.

🧰 Stack 클래스 직접 구현하기

class Stack:
    def __init__(self):
        self.items = []  # 내부적으로 리스트를 사용합니다.

    def push(self, item):
        self.items.append(item)  # 맨 끝에 아이템을 추가합니다.

    def pop(self):
        if self.empty():
            raise Exception("Stack is empty")
        return self.items.pop()  # 맨 끝에서 제거하고 반환합니다.

    def top(self):
        if self.empty():
            raise Exception("Stack is empty")
        return self.items[-1]  # 맨 끝 요소를 반환 (제거하지 않음)

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

    def empty(self):
        return not self.items

📦 사용 예제

s = Stack()          # 빈 스택 생성
s.push(2)
s.push(5)
s.push(9)

print(s.top())       # 👉 9 (가장 위에 있는 값)
s.pop()              # 9 제거
print(s.size())      # 👉 2

# 스택이 빌 때까지 top → pop 반복
while not s.empty():
    print(s.top())   # 👉 5, 2
    s.pop()

💡 실행 결과

9
2
5
2

🧑‍💻 실전에서 Stack은 어디에 쓰일까?

  • 웹 브라우저의 뒤로 가기 기능

  • 수식 계산기 (괄호 짝 맞추기, 후위 표기법 등)

  • DFS (깊이 우선 탐색) 알고리즘

  • 괄호 유효성 검사

  • 함수 호출 기록 관리

More from this blog

[Python 자료구조] Binary Tree(이진 트리) 개념과 배열

자료구조 중에서도 가장 자주 등장하고, 가장 중요한 트리 중 하나가 바로 이진트리(Binary Tree)이다.만약 자료구조 공부를 처음 시작했다면, 이진트리는 꼭 제대로 이해하고 넘어가야 할 핵심 개념이다. 그렇다면 이진트리는 도대체 어떤 구조이며, 왜 이렇게 중요할까? 🌳 이진트리란? 이진트리(Binary Tree)는 이름 그대로 자식 노드를 최대 두 개까지만 가질 수 있는 트리를 의미한다.자식 노드가 1개거나 0개일 수도 있지만, 최대...

Apr 8, 20253 min read

[Python 자료구조] Tree(트리) 구조

회사 조직도, 가계도, 또는 어떤 계층적인 구조를 표현할 때 자주 등장하는 그림이 있다. 바로 '트리 구조'이다. 그런데 이 구조를 처음 보면, "도대체 어디가 나무야?" 라고 생각할 수 있다. 하지만 나무를 거꾸로(180도 돌려서) 생각해보면 이해가 쉽다. 위쪽에 커다란 줄기(기둥)가 있고, 아래로 가지가 퍼져 나가는 모습과 아주 흡사하기 때문이다. 그래서 우리는 이런 구조를 트리(Tree) 구조라고 부른다. 🧩 트리(Tree)란 무엇인가...

Apr 8, 20253 min read

[Sql] 제약 조건과 무결성

SQL을 공부하다 보면 반드시 만나게 되는 용어들이 있다. 바로 기본키, 외래키, 무결성 제약 조건 같은 개념이다. 이 글에서는 이 용어들을 단순히 암기하는 게 아니라, 예시를 통해 자연스럽게 이해할 수 있도록 정리해보았다. 🎯 제약 조건이란? 제약 조건(Constraint)은 데이터베이스에 저장되는 데이터의 정확성과 신뢰성을 보장하기 위해 설정하는 규칙이다. ✅ 한 줄에 하나씩만 작성해야 하며, 테이블 생성 시 컬럼 옆에 정의하거나 AL...

Apr 7, 20253 min read

[Python TIL] Python에서 False와 True로 평가되는 값들

파이썬에서는 if 조건문이나 while 같은 컨트롤 흐름에서 자동으로 False로 간주되는 값들이 있다. 이걸 "Falsy 값" 또는 "Falsy Object" 라고 부른다. 이걸 알아두면 코드를 훨씬 깔끔하게 쓸 수 있다. 예를 들어, if not my_list: 같은 표현이 빈 리스트를 체크하는 데 쓰이기도 하기 때문이다. ⚠️ 파이썬에서 False로 평가되는 값들 (Falsy 값) 유형예시설명 숫자형0, 0.0, 0j정수, ...

Apr 6, 20252 min read

Code Compass

75 posts