[TIL: 0213] 스택1

ryun·2023년 2월 13일
0

TIL

목록 보기
17/34

스택

  • 물건을 쌓아 올리듯 자료를 쌓아 올린 형태의 자료구조
  • 스택에 저장된 자료는 선형 구조를 갖는다
    선형구조 : 자료 간의 관계가 1대1의 관계를 갖는다
    비선형구조: 자료 간의 관계가 1대N의 관계를 갖는다(예: 트리)
  • 스택에 자료를 삽입하거나 스택에서 자료를 꺼낼 수 있다
  • 마지막에 삽입한 자료를 가장 먼저 꺼낸다. 후입선출
    스택에 1, 2, 3 순으ㅗ 자료를 상빙ㅂ한 후 꺼내면 역순으로 3, 2, 1 로 꺼낸다

스택을 프로그램에서 구현하기 위해 필요한 자료구조와 연산

  • 자료구조: 자료를 선형으로 저장할 저장소
    배열 사용 가능
    저장소 자체를 스택이라 부르기도 한다
    스택에서 마지막 삽입된 원소의 위치를 top 이라 부른다

연산

  • 삽입 : 저장소에 자료 저장, push
  • 삭제 : 저장소에서 자료 꺼낸다. 꺼낸 자료는 삽입 자료의 역순, pop
  • 스택이 공백인지 아닌지 확인하는 연산은 isEmpty
  • 스택의 top 에 있는 item(원소)를 반환하는 연산 peek

스택의 삽입/삭제 과정

빈 스택에 원소 A, B, C를 차례로 삽입 후 한번 삭제하는 연산과정

스택의 push 알고리즘

(가능하면 스택의 크기를 정해놓고 움직이려고 한다)

  • append 메소드를 통해 리스트의 마지막에 데이터를 삽입
def push(item):
	s.append(item)

스택의 pop 알고리즘

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

스택 구현 고려 사항

  • 1차원 배열 사용해 구현할 경우, 구현이 용이하다는 장점이 있지만 스택의 크기를 변경하기가 어렵다는 단점
  • 저장소를 동적 할당하여 스택 구현하는 방법이 있다 (동적 연결리스트 이용) 구현은 복잡하지만 메모리를 효율적으로 사용한다는 장점이 있다

스택 응용1 : 괄호검사

  • 괄호의 종류 : 대괄호 [ ] , 중괄호 { }, 소괄호 ( )
  • 조건
    왼쪽괄호의 개수와 오른쪽 괄호 개수가 같아야 한다
    같은 괄호에서 왼쪽은 오른쪽보다 먼저 나와야 한다
    괄호 사이에는 포함 관계만 존재한다


여는 괄호 -> push
여는 괄호 -> push
닫는 괄호 -> pop

  • 괄호 없고 stack 비었으면 정상
  • 괄호 없고 stack에 남은 괄호가 있으면 오류
  • 닫는 괄호가 있는데 stack이 비어있으면 오류

알고리즘 개요

괄호를 차례대로 조사하면서 왼쪽 만나면 스택에 삽입!
오른쪽 만나면 스택에서 top 괄호를 삭제한 후 오른쪽과 짝이 맞는지 검사

스택 응용2: Function call

프로그램에서 함수 호출과 복귀에 따른 수행 순서를 관리

  • 가장 마지막에 호출된 함수가 가장 먼저 실행 완료하고 복귀하는 후입선출 구조 (스택 이용해 순서 관리)
  • 함수 호출 발생하면 지역변수, 매개변수, 복귀할 주소 등의 정보를 스택 프레임에저장해 시스템 스택에 삽입
  • 실행 끝나면 시스템 스택의 top 원소(스택 프레임)를 삭제(pop)하면서 프레임이 저장되어 있던 복귀주소를 확인하고 복귀
  • 함수 호출과 복귀에 따라 과정 반복하여 전체 프로그램이 종료되면 시스템 스택은 공백 스택이 된다

0개의 댓글