[Python] 스택 (stack) 기본개념

2025. 3. 25. 23:00·자료 구조

데이터를 임시 저장할 때 쓰는 자료구조
입, 출력 순서는 후입 선출 LIFO(Last In First Out) 방식

©️ 나

개요

위와 같이, 가장 나중에 추가된 데이터가 가장 먼저  선형 자료구조 임

실제 예로는 접시 쌓기나, 웹 브라우저의 뒤로가기 기능이 있음

주요 특성

  1. LIFO 구조 :
    마지막에 들어온 요소가 가장 먼저 나감
  2. 단순성 :
    삽입(push)와 삭제(pop) 연산만 지원
  3. 제한된 접근 :
    스택 내에서는 오직 top 요소만 접근 가능, 임의 접근(random access)가 불가능

기본 연산

스택 자료구조에서는 아래의 연산을 지원

  • push(item) : 스택의 top에 새 데이터를 삽입
  • pop() : top 요소를 제거하고 반환, 비어있으면 오류 발생
  • peek() 또는 top() : 스택의 top 요소를 제거하지 않고 반환
  • isEmpty() : 스택이 비어있는지 확인 (bool)

구현

아래는 list를 활용한 스택 구현 예제임

class Stack:
    def __init__(self):
        # 빈 스택 초기화 (내부적으로 리스트 사용)
        self.items = []

    def is_empty(self):
        # 스택이 비어있으면 True, 아니면 False 반환
        return len(self.items) == 0

    def push(self, item):
        # 새 데이터를 스택의 top에 추가
        self.items.append(item)

    def pop(self):
        # 스택이 비어있지 않으면 top 요소를 제거하고 반환
        if self.is_empty():
            raise IndexError("pop from empty stack")
        return self.items.pop()

    def peek(self):
        # 스택의 top 요소를 반환 (제거하지 않음)
        if self.is_empty():
            raise IndexError("peek from empty stack")
        return self.items[-1]

    def size(self):
        # 스택에 들어있는 데이터의 개수를 반환
        return len(self.items)

# 스택 사용 예제
if __name__ == '__main__':
    s = Stack()
    print("스택이 비어있는가?", s.is_empty())  # True 출력
    s.push(10)
    s.push(20)
    s.push(30)
    print("현재 스택의 크기:", s.size())      # 3 출력
    print("스택의 top:", s.peek())             # 30 출력
    print("pop:", s.pop())                     # 30 제거 및 반환
    print("pop:", s.pop())                     # 20 제거 및 반환
    print("현재 스택의 크기:", s.size())         # 1 출력

collections.deque로 스택 구현

deque는 Python에서 제공하는 내장 컨테이너 collection 모듈 내의 함수이며, 이는 맨 앞과 맨 끝 양쪽에서 원소를 추가/삭제하는 자료구조인 덱(deque)을 구현하는 함수임

  • 주요 속성 및 함수

append(x) deque의 맨 끝(오른쪽)에 x를 추가

appendleft(x) deque의 맨 앞(왼쪽)에 x를 추가

clear() 모든 원소를 삭제하고 크기를 0으로 만듦

copy() 얕은 복사(shallow copy)를 수행

count(x) 안에 있는 x와 같은 원소의 개수를 계산

extend(iterable) 순차 반복 인수 iterable에서 가져온 원소를 deque의 맨 끝(오른쪽)에 추가하여 확장

extendleft(iterable) 순차 반복 인수 iterable에서 가져온 원소를 deque의 맨 앞(왼쪽)에 추가하여 확장

index(x[, start[, stop]]) idx start부터 stop까지 양 끝을 포함한 범위에 존재하는 값 x들 중 가장 앞쪽의 원소 위치를 반환, x가 존재하지 않을 때 ValueError를 내보냄

insert(i, x) x를 deque의 i위치에 삽입. 이 때 크기 제한이 있는 deque의 경우 maxlen을 초과한 삽입은 IndexError 를 발생

pop() 맨 끝(우측)에 있는 원소 1개 삭제, 반환. 하나도 없는 경우는 IndexError 를 발생

popleft() 맨 앞(좌측)에 있는 원소 1개 삭제, 반환. 하나도 없는 경우는 IndexError 를 발생

remove(value) value와 같은 값을 가진 가장 앞의 항목을 삭제. 원소가 없는 경우는 ValueError를 발생

reverse() 원소를 역순으로 재정렬하고 None 를 반환

rotate(n = 1) 원소를 n값 만큼 오른쪽으로 밀어냄. 음수라면 왼쪽으로 밀어냄

활용

  • 함수 호츨 관리 : OS나 인터프리터는 함수 호출 시 콜 스택(Call Stack)을 사용하여 호출 순서와 반환 주소를 관리
  • 수식의 후위 표기법 계산 : 후위(postfix) 또는 전위(prefix) 표기법으로 변환한 수식을 계산할 때 스택을 사용
  • 문자열 처리 : 괄호의 균형 검사, 문자열 뒤집기 등 알고리즘 문제에 사용
728x90

'자료 구조' 카테고리의 다른 글

[Python] 그래프 기초  (0) 2025.03.29
[Python] 해시 테이블 (Hash Table)  (0) 2025.03.28
[Python] 연결 리스트(Linked List)의 기본 (w/ singly linked list)  (0) 2025.03.28
[Python] 링 버퍼 (Ring buffer) 와 원형 큐  (0) 2025.03.26
[Python] 큐 (queue) 기본개념  (0) 2025.03.26
'자료 구조' 카테고리의 다른 글
  • [Python] 해시 테이블 (Hash Table)
  • [Python] 연결 리스트(Linked List)의 기본 (w/ singly linked list)
  • [Python] 링 버퍼 (Ring buffer) 와 원형 큐
  • [Python] 큐 (queue) 기본개념
ahpicl64
ahpicl64
in the clouds
  • ahpicl64
    구름
    ahpicl64
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • WIL (4)
      • Jungle (36)
      • AWS (2)
      • SQL (2)
      • CS:APP (17)
      • Algorithm (10)
      • K8s (7)
      • 자료 구조 (10)
      • Spring (4)
      • React (0)
      • 운영체제 (1)
      • 기타등등 (2)
      • 이야기 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    CSAPP
    S3
    Spring
    IAM
    DB
    Spring boot
    github actions
    트러블슈팅
    어셈블리
    CloudFront
    자료구조
    부하테스트
    알고리즘
    python
    AWS
    EC2
    k8s
    queue
    DevOps
    컴퓨터시스템
  • 02-21 15:43
  • hELLO· Designed By정상우.v4.10.3
ahpicl64
[Python] 스택 (stack) 기본개념
상단으로

티스토리툴바