본문 바로가기
Algorithm

[Algorithm] 스택 (Stack) - Kotlin

by 준그래머 2021. 3. 20.
반응형

이번 포스팅에서는 스택(Stack)에 대해 정리해보고 직접 구현해보려 한다.

 

스택은 기본적으로 선형구조로 이루어져 있으며 LIFO(Last In First Out) 맨 마지막에 들어간 데이터를 가장 먼저 출력하는 방식의 구조를 갖고 있다.

 

기본적인 용어는 push(데이터를 넣는 함수), pop(데이터를 꺼낼 함수) top(데이터를 넣을 위치와 꺼낼 위치)가 있다.

 

스택을 구현할 때, push를 통해 데이터를 넣고 top의 값을 수정해주며 pop을 통해 데이터를 꺼내고 top의 위치를 수정하는 방식으로 구현하면 된다.

 

Stack.kt

import java.util.*

class Stack(private val size: Int) {

    private val stackArray = Array<Int?>(size){ _ -> null }

    // 배열에 데이터를 넣을 위치와 꺼낼 위치
    private var top = 0

    fun push(num: Int){
        if(top >= size){
            println("배열이 꽉 찼습니다. pop 명렬어를 통해 데이터를 하나 이상 제거해주세요.")
        }
        else{
            stackArray[top++] = num
        }
    }

    fun pop(): Int?{
        return if(top==0){
            stackArray[top]
        } else{
            val result = stackArray[--top]
            remove()
            result
        }
    }

    // 데이터 초기화
    private fun remove(){
        stackArray[top] = null
    }

    fun getStatus(){
        println("top: $top, stackArray: ${stackArray.toList()}")
    }

}

fun main(){
    val sc = Scanner(System.`in`)
    print("초기화 할 스택 배열의 크기를 입력>> ")
    val stack = Stack(sc.nextInt())
    while (true){
        print("push, pop, stop 중 1개 선택>> ")
        when(sc.next()){
            "push" -> {
                print("배열에 넣을 데이터 입력>> ")
                stack.push(sc.nextInt())
                stack.getStatus()
            }
            "pop" -> {
                println("출력된 값>> "+ (stack.pop() ?: "배열이 비어있습니다. 데이터를 넣어 주세요."))
                stack.getStatus()
            }
            "stop" -> {
                break;
            }
        }
    }
}

 

테스트 결과

초기화 할 스택 배열의 크기를 입력>> 4
push, pop, stop 중 1개 선택>> push
배열에 넣을 데이터 입력>> 151
top: 1, stackArray: [151, null, null, null]
push, pop, stop 중 1개 선택>> push
배열에 넣을 데이터 입력>> 603
top: 2, stackArray: [151, 603, null, null]
push, pop, stop 중 1개 선택>> pop
출력된 값>> 603
top: 1, stackArray: [151, null, null, null]
push, pop, stop 중 1개 선택>> pop
출력된 값>> 151
top: 0, stackArray: [null, null, null, null]
push, pop, stop 중 1개 선택>> pop
출력된 값>> 배열이 비어있습니다. 데이터를 넣어 주세요.
top: 0, stackArray: [null, null, null, null]
push, pop, stop 중 1개 선택>> pop
출력된 값>> 배열이 비어있습니다. 데이터를 넣어 주세요.
top: 0, stackArray: [null, null, null, null]
push, pop, stop 중 1개 선택>> push
배열에 넣을 데이터 입력>> 6939
top: 1, stackArray: [6939, null, null, null]
push, pop, stop 중 1개 선택>> push
배열에 넣을 데이터 입력>> 530
top: 2, stackArray: [6939, 530, null, null]
push, pop, stop 중 1개 선택>> push
배열에 넣을 데이터 입력>> 599
top: 3, stackArray: [6939, 530, 599, null]
push, pop, stop 중 1개 선택>> push
배열에 넣을 데이터 입력>> 55
top: 4, stackArray: [6939, 530, 599, 55]
push, pop, stop 중 1개 선택>> push
배열에 넣을 데이터 입력>> 644
배열이 꽉 찼습니다. pop 명렬어를 통해 데이터를 하나 이상 제거해주세요.
top: 4, stackArray: [6939, 530, 599, 55]
push, pop, stop 중 1개 선택>> push
배열에 넣을 데이터 입력>> 534
배열이 꽉 찼습니다. pop 명렬어를 통해 데이터를 하나 이상 제거해주세요.
top: 4, stackArray: [6939, 530, 599, 55]
push, pop, stop 중 1개 선택>> pop
출력된 값>> 55
top: 3, stackArray: [6939, 530, 599, null]
push, pop, stop 중 1개 선택>> pop
출력된 값>> 599
top: 2, stackArray: [6939, 530, null, null]
push, pop, stop 중 1개 선택>> pop
출력된 값>> 530
top: 1, stackArray: [6939, null, null, null]
push, pop, stop 중 1개 선택>> pop
출력된 값>> 6939
top: 0, stackArray: [null, null, null, null]
push, pop, stop 중 1개 선택>> pop
출력된 값>> 배열이 비어있습니다. 데이터를 넣어 주세요.
top: 0, stackArray: [null, null, null, null]
push, pop, stop 중 1개 선택>> stop

Process finished with exit code 0
반응형