スタックとキューの実装

Goでスタックとキューをそれぞれ実装してみた。

スライスを使ったパターンと連結リストを使ったパターンをそれぞれ実装している。

個人的にはスライスを使ったパターンの方が実装は楽かなと思う。

スタックのpush、pop、キューのenqueue、dequeueの時間計算量はそれぞれO(1)で実装できるが、一部サボってO(N)になってしまっているものがある。

スタック

ソースコード:stack

連結リスト

単純な連結リストで特に難しいところはないかなという印象。

スライス

スライスの操作で実装できる。スライスの先頭に要素を追加する書き方はちょっと慣れが必要かも。

キュー

ソースコード:queue

連結リスト

enqueueがキューの長さに依存してしまって、O(N)になってしまっている。

末尾のキューやキューの長さをデータ構造(queue)に持たせる実装にすればO(1)になるので、そっちのほうが望ましい。

スライス

単純なスライスの操作。連結リストである必要がない場合はこっちのほうが良いかもしれないが、スライスのメモリ効率(アロケーションとかコピーの発生とか)には気をつけたほうが良さそう。

所感

両方並行して実装しているとどっちがLIFOなのかFIFOなのか頭が混乱することがあるw