Kotlin でのスタック データ構造の使用

Kailash Vaviya 2024年2月15日
  1. Kotlin のスタック データ構造
  2. Kotlin での ArrayDeque() の使用
Kotlin でのスタック データ構造の使用

今日は、Kotlin でのスタックの使い方を学びます。 pushpoppeeksearch、および isEmpty を含む 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 スタックの search() 関数

スタック内の特定の要素を検索する場合は、search() 関数を使用できます。 オブジェクトがスタックにあるかどうかわからない場合は、オブジェクトを検索することもできます。

検索された要素がスタックで使用可能な場合、関数はスタック内の存在する番号を返します。 ただし、要素が利用できない場合は -1 が返されます。

cars スタックで 2つの自動車ブランドを検索するこの例を見てみましょう。 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

上記の出力では、フェラーリが 3rd の位置にあるため、最初の search() 関数は 3 を返しました。 しかし、2 番目の search() 関数は -1 を返します。Jeep がスタックにないからです。

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 でのスタック データ構造の使用 - 出力シックス

したがって、スタックが空かどうかを知ることが不可欠です。 以下に示すように、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

著者: Kailash Vaviya
Kailash Vaviya avatar Kailash Vaviya avatar

Kailash Vaviya is a freelance writer who started writing in 2019 and has never stopped since then as he fell in love with it. He has a soft corner for technology and likes to read, learn, and write about it. His content is focused on providing information to help build a brand presence and gain engagement.

LinkedIn