본문 바로가기

Python/데이터 구조

데이터 구조3. 스택(Stack) 파이썬에서 구현하기

반응형

1. 스택(Stack)의 기본 개념

 

2. 스택(Stack)의 구조

 

3. 스택구조 구현 해보기 - 재귀함수

 

 

1. 스택(Stack)의 기본 개념

 

 

오늘은 파이썬에서 가장 기본적인 데이터 구조 형태 중에 하나인 스택(Stack)에 대해서 알아보고자 합니다. 

 

Stack이라는 단어에서 유추해볼 수 있듯이 어떠한 데이터를 쌓고, 꺼내는 창고와 비슷한 구조라고 보시면 됩니다. 창고에서 물건을 꺼낼 때 맨 먼저 있는 것을 꺼낼 수도 있고, 반대로 맨 뒤에 있는 것부터 꺼낼 수도 있죠.

 

파이썬에서 스택도 마찬가지입니다. 아래의 그림을 보시면 더 이해가 빠르실 것 같습니다. 

 

스택의 구조
스택의 구조

 

 

 

2. 스택(Stack)의 구조

 

(1) 스택의 기본 정책

 : 스택은 LIFO(Last In, Fisrt Out) 또는 FILO(First In, Last Out) 데이터 관리 방식을 따릅니다.

 1) LIFO: 마지막에 넣은 데이터를 가장 먼저 추출하는 데이터 관리 정책

 2) FILO: 처음에 넣은 데이터를 가장 마지막에 추출하는 데이터 관리 정책

 

(2) 스택의 주요 기능

 1) push(): 데이터를 스택에 넣기

 2) pop(): 데이터를 스택에서 꺼내기

 

 

(3) 스택의 장단점 

  • 장점
    • 구조가 단순해서, 구현이 쉽다.
    • 데이터 저장/읽기 속도가 빠르다.
  • 단점 (일반적인 스택 구현시)
    • 데이터 최대 갯수를 미리 정해야 한다.
      • 파이썬의 경우 재귀 함수는 1000번까지만 호출이 가능함
    • 저장 공간의 낭비가 발생할 수 있음
      • 미리 최대 갯수만큼 저장 공간을 확보해야 함

참고: 스택은 단순하고 빠른 성능을 위해 사용되므로, 보통 배열 구조를 활용해서 구현하는 것이 일반적임. 이 경우, 위에서 열거한 단점이 있을 수 있음

 

 

3. 스택 구조 재현하기 

 

(1) 재귀함수를 통한 스택 구조 구현

 

재귀함수로 스택 구조가 파이썬에서 어떻게 움직이는지 한 번 보도록 하겠습니다. 쉽게 말해서, "짐을 쌓고, 맨 나중에 저장된 짐부터 꺼내는 논리"의 코드를 구현해봄으로써 조금 더 직관적으로 이해해보도록 하겠습니다. 

 

1
2
3
4
5
6
7
8
# 재귀 함수
def recursive(data):
    if data < 0:
        print ("ended")
    else:
        print(data)
        recursive(data - 1)
        print("returned", data)        
cs

 

우선 재귀함수가 무엇인지는 알고리즘 목차에서 자세히 다루어보도록 하겠습니다. 

 

이런 함수를 짜고, data = 5 넣어보면 다음과 같은 일이 일어납니다. 1부터 5까지 우선 데이터를 저장하고, 5부터 데이터를 꺼내는 것을 볼 수 있습니다. 

print(data)는 데이터가 저장되는 것을 보여주고, print("returned", data)는 데이터까 꺼내지는 논리를 보여줄 것입니다. 아래의 사진을 보시면 이해가 빠를 것이라 생각합니다. 

 

재귀함수를 통한 Stack(스택) 원리의 이해

 

 

 

 

(2) 리스트/array를 통한 스택(stack) 구조 구현

 

재귀함수는 이해를 하기 위해서 구성해본 알고리즘이라면, 이제는 진짜 스택구조를 쓸 수 있도록 한 번 함수를 짜보도록 하겠습니다. 

 

여러 방법이 있겠습니다만, 우리가 이때까지 학습했던 리스트(List)를 복습 차원에서 활용해보도록 하겠습니다. 리스트에서는 append와 pop이란 메소드가 있습니다. 이것을 사용하게 아주 간단하게 스택(stack)을 구현해볼 수 있습니다. 아래의 코드를 한 번 보시죠. 

 

1
2
3
4
5
6
7
8
9
stack_list = list()
 
def push(data):
    stack_list.append(data)
 
def pop():
    data = stack_list[-1]
    del stack_list[-1]
    return data
cs

 

 1) stack_list = list()

이 코드는 우선 데이터를 저장할 수 있도록 stack_list라는 변수를 선언을 해준 것입니다. 

 

2) def push(data):

    stack_list.append(data)

우선 이 코드는 데이터를 넣는 push라는 함수를 정의한 것입니다. 이는 stack_list에 data를 순차적으로 첨가하도록 append 메소를 활용했습니다. 

 

3) def pop() ## pop이라는 함수를 선언한다. 

  - data = stat_list[-1] ## 스택에 맨 마지막 데이터를 별도로 저장한다. 

  - del stack_list[-1] ## 스택 구조에 맨 마지막 데이터를 제거한다. 왜냐하면 창고에서 꺼낸 데이터는 더 이상 존재하면 안 되기 때문이다. 

  - return data ## 맨 마지막 데이터를 반환한다. 

 

이런식으로 구현할 수 있습니다. 이것을 간단하게 실제 데이터로 구현해보도록 할게요. 아래의 사진을 보시죠. 

 

리스트를 통한 스택 데이터 구조 구현

 

여기까지 읽어보셨으면 스택에 대해서 이해가 어느 정도 되셨을 것이라 생각합니다. 

 

항상 정독하지 마시고, 필요한 것만 빠르게 얻고 가시기 바랄게요!! 여러분이 더 알아보고 싶은 데이터 구조나 알고리즘이 있다면 댓글로 말씀해주시기 바랍니다.

 

 

 

이 블로그에 담겨 있는 커리큘럼 및 자료는 패스트캠퍼스 교육 자료 참고하여, 직접 수정하여 2차 가공 자료로 만든 것임을 알려드립니다. 

 

반응형