こんにちは、コンテンツクリエイターのともすけです。
ArrayDequeのはなしは下の方に置いていますので、お急ぎの方はスクロールしてくださいね。途中の文章も読んでもらえるとうれしいです。
今回は以下の問題に挑戦しています。
逆ポーランド記法ってなに?
逆ポーランド記法って「なにそれ?」だったのですが、要は…
![tomosuke](https://bunktiruu.com/wp-content/uploads/2021/04/fukidasi_tomosuke_000.jpeg)
算術式の表記法で、手前から「先に数値」を置いて、うしろに「演算子」を置く表記法みたいです。
ポイントは「後の数値を計算する」というモノ。どういうことかというと、たとえば
1 2 3 +
とあったら
2 + 3(うしろの2つだけ)
を計算するのですが、筆者は
1 + 2 + 3(演算子の手前全部)
を計算するモノと勘違い。全然答えにたどり着けず、数時間くらい「あーでもない、こーでもない」と四苦八苦していました。
そして、最初は自作のStackクラスを使っていました(Kotlin版のArrayListみたいな存在を知らなかった)が、四苦八苦してさらにググったところ「ArrayDeque」というライブラリに組み込まれた便利なクラスの存在を知りました。
またFIFOアクセスをしてしまい、勝手に迷路の中に迷い込んでいました。LIFOアクセスが必要でした。
コラム:FIFOとLIFO
FIFOアクセスは、配列の「さいご」にデータを追加していき、配列の「さいしょ」からデータを取り出すアクセス方法です。
LIFOアクセスは、配列の「さいご」にデータを追加していき、配列の「さいご」からデータを取り出すアクセス方法です。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
fun main() { val N = readLine()!!.toInt() val porland = readLine()!!.split(" ") val stack = ArrayDeque<Int>() for(i in 1..N){ val c = porland[i-1] if(c=="+" || c=="-"){ val v1 = stack.removeLast() val v2 = stack.removeLast() if(c=="+"){ stack.add(v1+v2) } else { stack.add(v2-v1) } } else { stack.add(c.toInt()) } } println(stack.removeLast()) } |
ArrayDequeの簡単な使い方
- 初期化
val ary = ArrayDeque<型>() - 最後に追加
ary.add(v) - 最初から取り出す(取りだしたデータは消えます)
ary.removeFirst() - 最後から取り出す(取りだしたデータは消えます)
ary.removeLast()
参考にしたサイトはこちら。
オフィシャルサイトはこちら(情報量おおいです)
まとめ
Kotlinで配列操作をらくにしたいときは、ArrayDequeクラスを利用するのがよさそう。
それではまた