C#のStackとQueueクラス徹底解説!基本操作からサンプルコードまで
C#には、データを効率的に管理するためのコレクションクラスが多数用意されています。その中でも特に重要なのがStack(スタック)とQueue(キュー)です。この記事では、それぞれの特徴、主要なメソッド、そして実際に動作するサンプルコードを交えて詳しく解説します。
Stack(スタック)とは
Stackクラスは、LIFO(Last-In, First-Out:後入れ先出し)方式でオブジェクトを管理するコレクションです。最後に追加した要素が最初に取り出される仕組みで、直前の状態に戻る処理(Undo機能)や、深さ優先探索など、後入れ先出しのアクセスが必要な場面で活用されます。
Stackクラスの主なプロパティ
- Count ― スタック内に格納されている要素数を取得します。
Stackクラスの主なメソッド
| No. | メソッドと説明 |
|---|---|
| 1 | public virtual void Clear(); スタックからすべての要素を削除します。 |
| 2 | public virtual bool Contains(object obj); 指定した要素がスタック内に存在するかどうかを判定します。 |
| 3 | public virtual object Peek(); スタックの先頭にあるオブジェクトを、削除せずに返します。 |
| 4 | public virtual object Pop(); スタックの先頭にあるオブジェクトを取り出して削除し、返します。 |
| 5 | public virtual void Push(object obj); スタックの先頭にオブジェクトを挿入します。 |
| 6 | public virtual object[] ToArray(); スタックの内容を新しい配列にコピーします。 |
Stackの使用例
以下は、Stackクラスを使い、Push()メソッドで要素を追加し、Pop()メソッドで要素を取り出すサンプルコードです。
using System;
using System.Collections;
namespace CollectionsApplication {
class Program {
static void Main(string[] args) {
Stack st = new Stack();
st.Push('A');
st.Push('B');
st.Push('C');
st.Push('D');
Console.WriteLine("Current stack: ");
foreach (char c in st) {
Console.Write(c + " ");
}
Console.WriteLine();
st.Push('P');
st.Push('Q');
Console.WriteLine("The next poppable value in stack: {0}", st.Peek());
Console.WriteLine("Current stack: ");
foreach (char c in st) {
Console.Write(c + " ");
}
Console.WriteLine();
Console.WriteLine("Removing values....");
st.Pop();
st.Pop();
st.Pop();
Console.WriteLine("Current stack: ");
foreach (char c in st) {
Console.Write(c + " ");
}
}
}
}
実行結果
Current stack: D C B A The next poppable value in stack: Q Current stack: Q P D C B A Removing values.... Current stack: C B A
この実行結果から、最後にPushした「D」が最初に表示され、Popするたびに後から追加した要素から順に取り出されていることがわかります。これがLIFO方式の動作です。
Queue(キュー)とは
Queueクラスは、System.Collections名前空間に含まれるコレクションクラスで、FIFO(First-In, First-Out:先入れ先出し)方式で要素を管理します。最初に追加された要素が最初に取り出される仕組みで、映画館のチケット売り場に並ぶ行列のように、先に来た人が先に処理されるイメージです。
Queueクラスには、主に次の2つのメソッドがあります。
- Enqueue() ― キューに値を追加します。
- Dequeue() ― キューから値を取り出します。
Enqueue:要素の追加
Enqueue()メソッドを使用すると、キューの末尾にアイテムを追加できます。
Queue q = new Queue();
q.Enqueue("Two");
q.Enqueue("One");
Dequeue:要素の取得
Dequeue()メソッドを使用すると、キューの先頭からアイテムを取り出せます。追加した順序どおりに要素が返される点がポイントです。
Queue q = new Queue();
q.Enqueue("Two");
q.Enqueue("One");
// 要素をすべて取り出す
while (q.Count > 0)
Console.WriteLine(q.Dequeue());
このコードを実行すると、「Two」「One」の順に出力されます。つまり、先にEnqueueした要素が先にDequeueされるため、FIFOの特性が確認できます。
まとめ
StackとQueueは、どちらも要素のコレクションを扱う基本的なデータ構造ですが、StackはLIFO(後入れ先出し)、QueueはFIFO(先入れ先出し)という対照的な特性を持ちます。用途に応じて適切に使い分けることで、より効率的で読みやすいプログラムを作成できます。
-
【解決済み】Windows 10/11で印刷キューのジョブが削除できないときの対処法
プリンターが正常に動作しないエラーは多くのユーザーにとってよくある悩みですが、その中でも「Windows 10やWindows 11で印刷キューからドキュメントが削除できない」というトラブルに困っている方も少なくありません。 この記事の内容 印刷キューが削除できない問題の概要 印刷ジョブがキューに滞留する原因 Windows 11/10で印刷キューをクリアする4つの方法 印刷キューが削除できない問題の概要 Windows 10やWindows 11では、いつ印刷ジョブがキューに滞留してもおかしくありません。よくあるケースとしては以下のようなものがあります。 1. ドキュメントを印刷
-
スタックとヒープの違いを徹底解説!メモリ管理の基礎知識
プログラムの実行において、メモリ管理は非常に重要な概念です。本記事では、メモリ領域を代表する「スタック」と「ヒープ」の違いについて、それぞれの特徴やメリット・デメリットをわかりやすく解説します。 スタック(Stack)とは スタックは、後入れ先出し(LIFO:Last In First Out)の方式でデータを管理する線形データ構造です。関数呼び出し時のローカル変数など、寿命が明確なデータの格納に適しています。主な特徴は以下の通りです。 線形データ構造であり、メモリは連続したブロックとして割り当てられる。 メモリの割り当てと解放は、コンパイラの指示によって自動的に行われる。 構築・維持にかか