개발새발/알고리즘

[Kotlin] 스택 - Stack

조희우 2023. 7. 31. 04:00

🔷 스택(Stack)이란?

    스택(Stack)은 쌓아 올린다는 의미이다.

    선형 리스트의 한쪽에서만 자료의 입력과 출력이 가능한 자료구조이다.

    따라서 선형 리스트의 끝 부분에 대한 정보를 가지고 있는 변수가 필요하다.

    이런 스택의 구조를 후입선출 (LIFO, Last-In First-Out)구조 라고 한다.

🔹스택의 끝 부분 : top

        스택은 정해진 방향으로만 데이터를 삽입, 출력이 가능하다.

        통 속에 물건을 집어넣거나, 접시를 쌓아올리는 형식과 유사하다.

        스택을 사용하기 위해서는 데이터가 이동하는 위치 정보가 필요하며, 주로 변수명으로 top을 사용한다.

        top은 가장 최근에 삽입된 자료를 가르키며, 새 자료는 top이 가르키는 자료 위에 쌓인다.

        삭제 또한 top이 가리키는 자료부터 순서대로 진행된다.

 

        🔹push() : top을 통해 스택에 데이터를 삽입하는 연산

        🔹pop()   : top을 통해 스택에 데이터를 삭제하는 연산

🔹후입선출 (LIFO, Last-In First-Out)

        스택은 한쪽 끝(top)에서만 데이터의 삽입과 삭제 작업이 진행되며, 시간 순서에 따라 데이터가 쌓인다.

        따라서 가장 나중에 들어온 원소가 가장 먼저 삭제되는 특성을 가진다.

       이런 스택의 구조를 후입선출(LIFO : Last-Int First-Out)를 가지게 된다.


🔷 stack overflow

       스택이 비어있을 경우 top은 -1의 값을 가진다.
       비어있는 스택(top==-1)에서 원소를 추출하려고 할 때 stack underflow라고 한다.

       지정한 스택의 최대크기를 넘어설 경우 stack overflow가 발생한다.

       유명한 개발 사이트 stack overflow의 유래이다.


🔷 스택 사용법

     Stack -> 스택 초기 설정

     push -> 스택에 데이터 삽입 : 가장 위에 삽입

     add -> 스택에 데이터 삽입 : 정해진 위치에 삽입 / 변경

     pop -> 스택에 데이터 반환 및 삭제

     peek -> 현재 top 위치 반환

     size -> 스택의 크기 반환

     stack[i] -> 스택의 i번째 원소 반환

     search -> 원소의 위치를 위에서부터 탐색하여 반환 : Index 번호 아님!

     isEmpty | isNotEmpty  -> 스택의 원소 존재 유무 확인


🔹Import

       kotlin에서는 자체적으로 Stack을 제공하지 않으므로 직접 구현하거나 java에서 호출한다.

       현 게시글에서는 java에서 호출하는 방식으로 작성한다.

       java.util 에서 전체(*)혹은 스택(Stack)만 import하여 사용한다.

import java.util.*
import java.util.Stack

🔹Stack 

        스택 초기 설정

val stack : Stack<DataType> = Stack<DataType>()

🔹push

        스택에 데이터 삽입

        가장 위(top 위치)에 원소를 삽입한다.

stack.push(value)

🔹add

       스택에 데이터 삽입

       지정한 위치에 원소를 삽입한다.

stack.add(index, value)

🔹pop

        스택에 데이터 반환 및 삭제

        빈 스택에 사용할 경우 에러 발생 : Exception in thread "main" java.util.EmptyStackException

stack.pop()

🔹peek

        현재 top 위치 반환

        빈 스택에 사용할 경우 에러 발생 : Exception in thread "main" java.util.EmptyStackException

stack.peek()

🔹size

        스택의 크기 반환

stack.size

🔹stack[i]

        스택의 i번째 원소 반환

stack[index]

🔹search

        원소의 위치를 위에서부터 탐색하여 반환

        Index 번호는 아래에서부터로 혼동하지 않도록 주의한다.

        만약, 원소가 존재하지 않을 경우 -1을 반환한다.

stack.search(value)

🔹isEmpty | isNotEmpty

        스택의 원소 존재 유무 확인

stack.isEmpty()
stack.isNotEmpty()

        ✨ isEmpty()과 isNotEmpty()의 출력 차이

                isEmpty(): 빈 스택일 경우 true

                isNotEmpty() : 빈 스택이 아닐 경우 true


🔷 스택의 모든 원소 삭제

🔹isNotEmpty() + pop()

        스택이 비어있지 않을 경우 반복

        스택의 원소를 삭제

while(stack.isNotEmpty()){
	stack.pop()
}