logo
Search검색어를 포함하는 게시물들이 최신순으로 표시됩니다.
    Table of Contents
    [Algorithm] 스택(Stack)

    이미지 보기

    [Algorithm] 스택(Stack)

    스택에 대해 알아보자.

    • 22.02.21 작성

    • 읽는 데 6

    TOC

    스택(Stack)

    • 물건을 쌓아 올리듯 자료를 쌓아올린 형태의 자료구조

    • 선형 구조를 갖는다.

      • 선형구조 : 자료간의 관계가 1:1
      • 비선형구조 : 자료간의 관계가 1:N(ex. 트리)
    • 자료를 삽입하거나 꺼낼 수 있다.

    • 후입선출(LIFO; Last-In-First-Out)


    스택의 연산

    • 배열 사용 가능

    • 저장소 자체를 스택이라고도 한다.

    • 마지막 삽입된 원소의 위치 : top

    • push : 스택에 자료 저장(삽입)

    • pop : 스택의 자료 꺼냄(삭제)

    • peek : top에 있는 item 반환

      • pop은 반환 후 삭제, peek은 반환만!
    • isEmpty : 스택 비었는지 확인


    스택 push 알고리즘

    append 메소드를 통해 리스트의 마지막에 데이터 삽입

    def push(item):
        s.append(item)
    

    append()은 파이썬에서 상당히 느린 메서드이다. 왜냐하면 메모리 공간에서 배열의 뒤에 다른 데이터들이 있으면 배열을 더 확장할 수 없어서, 삽입해준 데이터를 수용할 공간을 확보하기 위해 다른 공간에 또다른 배열을 만들기 때문이다. 이 과정에서 불필요한 시간이 발생한다. 때문에 stack을 정의할 때 크기를 같이 결정하여 미리 필요한 배열의 크기를 확보한다.

    참고❗ 파이썬 창시자 귀도 반 로섬은 기존에 존재하는 append와 동일한 기능을 가진 다른 이름의 pop을 추가하는 것을 긍정적으로 생각하지 않는다고 한다. 그리고 맨 마지막에 넣고 빼는 것은 append()와 pop() 메서드의 퍼포먼스도 느리지 않다는 교수님의 다른 견해도 있다.

    그래도 다른 방식으로 stack의 push를 아래와 같이 표현해보자.

    def push(item, size):
        global top
        top += 1
        if top==size:
            print('overflow!')  # 디버깅용
        else:
            stack[top] = item
    
    size = 10
    stack = [0]*size
    top = -1
    
    push(10, size)
    top += 1
    stack[top] = 20
    

    스택 pop 알고리즘

    def pop():
        if len(s) == 0:
            return  #underflow
        else:
            return s.pop()
    

    pop()은 파이썬에서 상당히 느린 메서드이기 때문에 아래와 같이 표현해보자.

    def pop():
        global top
        if top == -1:
            print('underflow!')
            return 0
        else:
            top -= 1
            return stack[top+1]
    
    print(pop())
    

    또는 아래와 같은 방법도 사용할 수 있다.

    def pop():
        global top
        if top > -1:
            top -= 1
            print(stack[top])
    

    스택 구현 고려 사항

    • 장점 : 구현이 용이

    • 단점 : 스택의 크기 변경 어렵다.

    • 해결방안 : 저장소를 동적으로 할당하여 스택 구현!!


    동적 연결리스트(linked list)

    • 단점 : 구현이 복잡
    • 장점 : 메모리를 효율적으로 사용

    스택의 응용

    괄호 검사

    괄호 조건

    • 왼쪽 괄호의 개수와 오른쪽 괄호의 개수가 같아야 한다.
    • 같은 괄호에서 왼쪽 괄호는 오른쪽 괄호보다 먼저 나와야 한다.
    • 괄호 사이에는 포함 관계만 존재한다.

    알고리즘

    • 문자열에 있는 괄호를 차례대로 조사

    • 왼쪽 괄호 만나면 : 스택에 삽입

    • 오른쪽 괄호 만나면 : 스택에서 top 괄호 pop & 오른쪽 괄호와 일치하는지 확인

    • 스택이 비어있거나 괄호의 짝이 맞지 않으면 오류

    • 마지막 괄호까지 조사 후 스택에 괄호가 남아있으면 오류


    function call

    • 프로그램에서의 함수 호출과 복귀에 따른 수행 순서 관리
    • 가장 마지막에 호출된 함수가 가장 먼저 실행을 완료하고 복귀하기 때문

    함수 호출 발생

    • 수행에 필요한 지역변수, 매개변수 및 수행 후 복귀할 주소 등의 정보 확인
    • 이를 스택 프레임(stack frame)에 저장
    • 이를 시스템 스택에 삽입

    함수 실행 종료

    • 시스템 스택의 top 원소(스택 프레임)를 삭제(pop)
    • 프레임에 저장되어 있던 복귀주소를 확인 후 복귀

    전체 수행 및 종료

    • 함수 호출과 복귀에 따라 이 과정을 반복
    • 전체 프로그램 수행이 종료되면 시스템 스택은 공백 스택
    profile

    FE Developer 박승훈

    노력하는 자는 즐기는 자를 이길 수 없다