MasaのITC Life

夢は起業家!全てにおいて凡人だけど頑張ることだけはいっちょ前!

プログラミング

【アルゴリズムとデータ構造】Go言語でスタックを実装する

投稿日:2020年11月2日 更新日:



Go言語でスタックを簡易実装します。

データに対する操作として、

以下の3つを実装します。



New() : スタックの初期化

Push() : 要素の追加

Pop() : 要素の取り出し



コードは以下のようになります。

例として以下の実行画面も載せます。

ちなみにscan()を抜けるとき、

スタックに要素が残っている場合は、

全て吐き出すようにしてあります。



Goだとスライスの概念があるので、

スタックの長さ事前に決める必要がないのは、

ありがたいですね!

スライスが可変長配列を実現してくれるおかげです。



しかし実際は、要素をappend()するたびに、

固定長配列が作成されなおすので、

スライスが示すアドレスも変わります。



これが意味するのは、

旧配列がゴミになるということです。

これを取り除かないとメモリを圧迫します。




とはいえ、、、

Goにはガベージコレクタが標準であるので、

ランタイムが定期的にこのゴミ掃除をしてくれます。



自分で切り出しておいて結局のところ、

メモリ解放は気にする必要はないですけどね。



上述したことをもっと詳しく知りたい方は、

こちらの記事を参考にして下さい^^

メモリとガベージコレクタについて書いてあります。





さらに補足ですが、

今回はスタック構造体でint型のスライスを宣言しましたが、

実際は []*int のようにポインタにした方が良いと思います。



intなので1要素あたりのバイトはたかが知れていますが、

サイズの大きい構造体などを出し入れする場合は、

メモリ上でまとまった領域を確保することが

困難になる可能性があります。



したがってポインタを出し入れすることで、

実態はメモリ上で不連続に確保されても

良いようにしておきます。








最後まで読んでいただきありがとうございました。


-プログラミング

Copyright© MasaのITC Life , 2021 All Rights Reserved Powered by STINGER.