Data Structure

[파이썬(Python)] 스택(Stack)

Reife 2023. 2. 15.

 

물건을 쌓는 것 처럼, 데이터가 입력된 순서대로 데이터를 쌓아서 나중에 들어온 데이터부터 출력하는 자료구조이다.

 

이처럼 나중에 들어온 데이터 부터 출력하는 것을 후입선출(Last In First Out)이라고 한다.

배열 또는 연결 리스트로 구현할 수 있다.

 

  • Push: 스택에 데이터를 넣는 것
  • Pop: 스택에서 데이터를 꺼내는 것. 가장 마지막에 push한 데이터를 반환한다.

 

 

 

코드 출처: Do it! 자료구조와 함께 배우는 알고리즘 입문

from typing import Any

class FixedStack:
    # 고정 길이 스택 클래스

    class Empty(Exception):
        # 비어 있는 FixedStack에 팝 또는 피크할 때 내보내는 예외 처리
        pass
    
    class Full(Exception):
        # 가득 찬 FixedStack에 푸시할 때 내보내는 예외 처리
        pass
    
    def __init__(self, capacity: int = 256) -> None:
        # 스택 초기화
        self.stk = [None] * capacity # 스택 본체
        self.capacity = capacity # 스택의 크기
        self.ptr = 0 # 스택 포인터

    def __len__(self) -> int:
        # 스택에 쌓여 있는 데이터 개수 반환
        return self.ptr
    
    def is_empty(self) -> bool:
        return self.ptr <= 0
    
    def is_full(self) -> bool:
        return self.ptr >= self.capacity
    
    def push(self, value: Any) -> None:
        # 스택에 value를 푸시
        if self.is_full():
            raise FixedStack.Full
        self.stk[self.ptr] = value
        self.ptr += 1
        
    
    def pop(self) -> Any:
        # 스택에서 데이터 pop
        if self.is_empty():
            raise FixedStack.Empty
        self.ptr -= 1
        return self.stk[self.ptr]
    
    def peek(self) -> Any:
        if self.is_empty():
            raise FixedStack.Empty
        return self.stk[self.ptr - 1]
    
    def clear(self) -> None:
        self.ptr = 0

    def find(self, value: Any) -> Any:
        # 스택에서 value를 찾아 index 반환
        for i in range(self.ptr -1, -1, -1): # 꼭대기 쪽부터 선형 검색
            if self.stk[i] == value:
                return i
        return -1
    
    def count(self, value: Any) -> int:
        # stack에 있는 value의 개수 반환
        c = 0
        for i in range(self.ptr):
            if self.stk[i] == value:
                c += 1
        return c
    
    def __contains__(self, value: Any) -> bool:
        return self.count(value) > 0
    
    def dump(self) -> None:
        # 스택 안의 모든 데이터를 바닥부터 꼭대기까지 출력
        if self.is_empty():
            print("스택이 비어 있습니다.")
        else:
            print(self.stk[:self.ptr])

'Data Structure' 카테고리의 다른 글

[파이썬(Python)] 덱(Deque)  (0) 2023.02.16
[파이썬(Python)] 큐(Queue)  (0) 2023.02.15
[파이썬(Python)] 연결 리스트(Linked List)  (0) 2023.02.15
배열(array)  (0) 2023.02.15
자료구조  (0) 2023.02.15

댓글