VB.NETのStack(スタック)を完全解説!LIFO処理の基本と使い方
生徒
「VB.NETで、積み上げた本のように『最後に置いたものから順に取る』仕組みは作れますか?」
先生
「それは『Stack(スタック)』という仕組みを使えば簡単に実現できますよ。」
生徒
「スタック……。前回のキューとは逆の動きをするということでしょうか?」
先生
「その通り!『後入れ先出し』というルールですね。具体的なプログラムの書き方を見ていきましょう!」
1. Stack(スタック)とは?「後入れ先出し」の仕組み
VB.NETのStack(スタック)とは、データを一列に並べて管理する「コレクション」の一種です。最大の特徴は、LIFO(ライフォ)という仕組みで動くことです。LIFOは「Last In, First Out」の略で、日本語では「後入れ先出し」と言います。
プログラミング未経験の方に一番わかりやすい例えは、机の上に積み上げられた「本」や「お皿」です。新しいものを上に積み上げると、最初に取り出すことができるのは、一番最後に乗せた一番上のものですよね。一番下にあるもの(最初に入れたもの)を取り出すには、上のものをすべてどかさなければなりません。このように、データの追加と取り出し口が同じ場所にあるのがスタックの構造です。
2. データを積む操作:Push(プッシュ)
スタックに新しいデータを追加することを、専門用語でPush(プッシュ)と呼びます。本を積み上げる動作そのものを指す言葉だと思ってください。
VB.NETでスタックを使うときは、Stack(Of 型名)という書き方をして準備(インスタンス化)します。ここでは、閲覧したページの履歴を管理するようなイメージで、文字列(String型)のスタックを作ってみましょう。パソコンの操作に慣れていない方でも、この「追加はPush」という合言葉を覚えれば大丈夫です。
' 文字列を入れるためのスタックを新しく作る
Dim history As New Stack(Of String)()
' データを積み上げる(Push)
history.Push("ホーム画面")
history.Push("商品検索ページ")
history.Push("商品詳細ページ")
Console.WriteLine("ページ履歴を保存しました。")
これで、スタックの一番上には最後にPushした「商品詳細ページ」が置かれている状態になります。データを追加するたびに、古いデータはどんどん下の方へと追いやられていきます。
3. データを取り出す操作:Pop(ポップ)
スタックの一番上にあるデータを取り出し、同時にスタックから削除する操作をPop(ポップ)と言います。積み上げた本の一番上を手に取るイメージです。
Popを使うと、最後にPushしたデータが返ってきます。ブラウザの「戻る」ボタンを押したときに、直前に見ていたページに戻るような仕組みを想像するとわかりやすいでしょう。一度Popしたデータはスタックの中からは消えてしまうため、取り扱いには注意が必要です。
' 一番上のデータを取り出して削除する(Pop)
Dim lastPage As String = history.Pop()
Console.WriteLine("戻るボタンで移動した先: " & lastPage)
Console.WriteLine("スタックに残っている数: " & history.Count)
戻るボタンで移動した先: 商品詳細ページ
スタックに残っている数: 2
最後にPushした「商品詳細ページ」が最初に出てきましたね。これが「後入れ先出し」の動きです。
4. 一番上をこっそり確認:Peek(ピーク)
「一番上のデータは何かな?」と確認したいけれど、まだ取り出して消したくない……という時もありますよね。そんな時に便利なのがPeek(ピーク)メソッドです。Peekには「そっと覗く」という意味があります。
Peekを使えば、スタックの中身の順番や数を変えずに、現在のトップにあるデータの中身だけを知ることができます。次に何を取り出すかを確認して、条件分岐(if文など)で処理を分けたい時によく使われます。未経験の方でも、この「覗き見」を活用することで、エラーの少ない安全なプログラムを書けるようになります。
' 一番上のデータを覗き見する(削除はしない)
Dim topItem As String = history.Peek()
Console.WriteLine("現在の一番上にあるデータ: " & topItem)
Console.WriteLine("スタックの数は変わりません: " & history.Count)
現在の一番上にあるデータ: 商品検索ページ
スタックの数は変わりません: 2
5. 実務での使いどころ:スタックはどんな時に使う?
「わざわざ不便に後から入れたものから出す必要なんてあるの?」と思うかもしれません。しかし、プログラミングの実務では、このスタックの仕組みは「神様」のように重宝される場面があります。
- 「元に戻す(Undo)」機能: 文章作成ソフトなどで、操作を一つずつ戻す機能はスタックで管理されています。最新の操作をPopして捨てれば、一つ前の状態に戻れます。
- 式の計算(カッコの解析): 数学の式の「( )」が正しく閉じられているかチェックする際、開きカッコをスタックに積み、閉じカッコが来たらPopするという手法が使われます。
- 迷路の探索: 分かれ道に来たときに道をスタックに保存しておき、行き止まりになったらスタックから最新の地点をPopして戻る「バックトラック」という手法で使われます。
このように、「来た道を戻る」「最新の状態を優先する」といった処理において、スタックは欠かせない存在なのです。
6. 注意!空のスタックから取り出そうとすると?
ここで初心者が陥りやすい例外(エラー)についてお話しします。中身が空っぽのスタックに対して、PopやPeekを実行しようとすると、プログラムは「取り出すものがありません!」と怒って止まってしまいます。
これを防ぐためには、操作をする前に必ずスタックのCount(カウント)プロパティを確認しましょう。Countが0より大きい時だけ操作するようにif文で囲むのが、プロのプログラマーへの第一歩です。安全第一でコードを書く癖をつけていきましょう。
' 空っぽかどうかチェックしてから取り出す
If history.Count > 0 Then
Dim page As String = history.Pop()
Console.WriteLine(page & " を取り出しました。")
Else
Console.WriteLine("履歴はありません。")
End If
7. StackとQueueの決定的な違い
よく似たコレクションに「Queue(キュー)」がありますが、改めて違いを整理しましょう。プログラミングにおいて、この使い分けができるようになることは非常に重要です。
| 特徴 | Stack(スタック) | Queue(キュー) |
|---|---|---|
| 処理ルール | LIFO(後入れ先出し) | FIFO(先入れ先出し) |
| 例え | 積み上げた本、お皿 | レジの行列、チケット売り場 |
| 追加の命令 | Push(プッシュ) | Enqueue(エンキュー) |
| 削除の命令 | Pop(ポップ) | Dequeue(デキュー) |
「後から来たものを先に処理するのがスタック」「先に来た人を優先するのがキュー」です。この違いをマスターすれば、VB.NETのデータ管理はぐっと楽になります。自分の作りたい機能がどちらのルールに適しているか、じっくり考えて選んでみてくださいね!