HOWTO · Kotlin

Kotlin에서 스택 데이터 구조 사용

이 문서에서는 Kotlin에서 스택 데이터 구조를 사용하는 방법을 설명합니다. 또한 스택 및 대안과 함께 사용할 수 있는 몇 가지 방법을 나열합니다.

이 페이지의 내용

오늘은 코틀린에서 스택을 사용하는 방법에 대해 알아보겠습니다. 또한 push, pop, peek, searchisEmpty를 포함하는 Kotlin 스택을 업데이트하고 변경하는 데 사용되는 표준 함수도 볼 수 있습니다.

또한 Kotlin의 스택보다 더 나은 대안을 살펴볼 것입니다.

Kotlin의 스택 데이터 구조

스택은 후입선출(LIFO) 메커니즘을 따르는 데이터 구조입니다. 이는 여러 개체의 데이터베이스를 만드는 데 사용할 수 있음을 의미합니다.

스택은 Java 컬렉션 프레임워크의 일부이므로 Java에서 사용이 두드러지지만 Java에서 Stack 라이브러리를 가져와서 Kotlin에서 스택을 생성할 수 있습니다.

라이브러리를 가져오면 스택을 생성하고 개체를 추가할 수 있습니다. 이 예제에서는 cars라는 스택을 생성한 다음 addAll() 메서드를 사용하여 자동차 브랜드 이름을 추가합니다.

import java.util.Stack

fun main(args: Array<String>){
    var cars = Stack<String>();
    cars.addAll(listOf("Mercedes-Benz", "BMW", "Ferrari", "Porsche"))

    for(c in cars){
        println(c)
    }

}

출력:

kotlin에서 스택 데이터 구조 사용 - 출력 1

보시다시피 위의 코드 예제는 스택을 생성하고 4개의 자동차 브랜드를 추가합니다. 다음으로 사전 정의된 함수를 사용하여 이 스택을 작동하는 방법을 살펴보겠습니다.

Kotlin 스택의 push() 함수

push() 함수를 사용하면 스택에 새 객체를 추가할 수 있습니다. 추가된 개체는 기본적으로 스택의 맨 위로 이동됩니다.

아래 예제에서는 push() 함수를 사용하고 위에서 생성한 스택에 다른 객체를 추가합니다.

import java.util.Stack

fun main(args: Array<String>){
    var cars = Stack<String>();
    cars.addAll(listOf("Mercedes-Benz", "BMW", "Ferrari", "Porsche"))
    cars.push("Lamborghini")

    for(c in cars){
        println(c)
    }

}

출력:

kotlin에서 스택 데이터 구조 사용 - 출력 2

Kotlin 스택의 pop() 함수

이름에서 알 수 있듯이 pop() 함수는 스택에 추가된 마지막 요소를 팝아웃합니다. 따라서 마지막에 추가된 요소 때문에 후입선출 메커니즘이 먼저 제거됩니다.

따라서 동일한 예를 고려하여 스택 맨 위에 있는 객체, 즉 Lamborghini를 제거하려면 pop() 함수를 사용하여 제거할 수 있습니다. 여기에 동일한 코드가 있습니다.

import java.util.Stack

fun main(args: Array<String>){

    var cars = Stack<String>();
    cars.addAll(listOf("Mercedes-Benz", "BMW", "Ferrari", "Porsche"))
    cars.push("Lamborghini")

    for(c in cars){
        println(c)
    }

    var poppedCar = cars.pop()
    println("\nThe car brand that is popped out is: " + poppedCar)
    println("\nThe new list of car brands is: ")

    for(c in cars){
        print(c + ", ")
    }

}

출력:

kotlin에서 스택 데이터 구조 사용 - 출력 3

Kotlin 스택의 peek() 함수

peek() 함수를 사용하면 Kotlin 스택을 엿볼 수 있습니다. 그것은 우리가 그것을 제거하지 않고 스택의 맨 위에 있는 객체를 찾을 수 있다는 것을 의미합니다.

아래 예제는 peek() 함수를 보여줍니다. 다음으로 자동차 브랜드 Lamborghini를 스택에 추가하고 peek() 함수를 사용하여 인쇄합니다.

import java.util.Stack

fun main(args: Array<String>){

    var cars = Stack<String>();
    cars.addAll(listOf("Mercedes-Benz", "BMW", "Ferrari", "Porsche"))
    cars.push("Lamborghini")

    for(c in cars){
        println(c)
    }

    var peekCar = cars.peek()
    println("\nPeeked Car is: " + peekCar)

}

출력:

kotlin에서 스택 데이터 구조 사용 - 출력 4

Kotlin Stack의 search() 함수

스택에서 특정 요소를 검색하려면 search() 기능을 사용할 수 있습니다. 스택에 있는지 여부가 확실하지 않은 경우 개체를 검색할 수도 있습니다.

검색된 요소가 스택에서 사용 가능한 경우 함수는 스택에서 해당 요소가 있는 번호를 반환합니다. 그러나 요소를 사용할 수 없는 경우 -1을 반환합니다.

car 스택에서 두 개의 자동차 브랜드를 검색하는 이 예를 살펴보겠습니다. FerrariJeep 요소를 찾습니다.

import java.util.Stack

fun main(args: Array<String>){

    var cars = Stack<String>();
    cars.addAll(listOf("Mercedes-Benz", "BMW", "Ferrari", "Porsche"))
    cars.push("Lamborghini")

    for(c in cars){
        println(c)
    }

    println("\nLooking for Ferrari: " + cars.search("Ferrari"))
    println("Looking for Jeep: " + cars.search("Jeep"))

}

출력:

kotlin에서 스택 데이터 구조 사용 - 출력 5

위의 출력에서 첫 번째 search() 함수는 Ferrari가 3rd 위치에 있으므로 3을 반환했습니다. 그러나 두 번째 search() 함수는 Jeep이 스택에 없기 때문에 -1을 반환합니다.

Kotlin 스택의 isEmpty() 함수

빈 스택에서 일부 기능을 수행하려고 하면 오류가 발생합니다. 예를 들어 빈 스택에서 pop() 함수를 사용하면 java.util.EmptyStackException이 발생합니다.

import java.util.Stack

fun main(args: Array<String>){

    var cars = Stack<String>();
    cars.addAll(listOf())
    var v = cars.pop()

}

출력:

kotlin에서 스택 데이터 구조 사용 - 출력 6

따라서 스택이 비어 있는지 여부를 아는 것이 중요합니다. 아래와 같이 isEmpty() 함수를 사용하여 알 수 있습니다.

import java.util.Stack

fun main(args: Array<String>){

    var cars = Stack<String>();
    cars.addAll(listOf("Mercedes-Benz", "BMW", "Ferrari", "Porsche", "Lamborghini"))

    if(cars.isEmpty()){
        println("This stack is empty")
    }
    else{
        println("This stack is not empty")
    }
}

출력:

kotlin에서 스택 데이터 구조 사용 - 출력 7

Kotlin에서 ArrayDeque() 사용

스택은 유용한 데이터 구조이지만 Kotlin에서는 사용하지 않는 것이 좋습니다. 대신 Deque를 사용하는 것이 좋습니다. Deque는 큐와 스택으로 모두 작동할 수 있는 양방향 큐를 의미합니다.

kotlin.collections.ArrayDeque는 Kotlin 1.3.70에서 도입되었습니다. Kotlin 스택 대신 Deque를 사용하여 스택과 동일한 작업을 수행하는 방법은 다음과 같습니다.

import java.util.ArrayDeque

fun main(args: Array<String>){

    var stackExample = ArrayDeque<String>()
    stackExample.push("Mercedes-Benz")
    stackExample.push("BMW")
    stackExample.push("Ferrari")
    stackExample.push("Porsche")
    println(stackExample)
    println("\n" + stackExample.isEmpty())

    println("\n" + stackExample.pop())
    println("\n" + stackExample)

    stackExample.push("Lamborghini")
    println("\n" + stackExample)

}

출력:

kotlin에서 스택 데이터 구조 사용 - 출력 8