C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でのスタック(Stack)クラスの実装と使い方

C#のStackクラスは、LIFO(Last-In, First-Out:後入れ先出し)方式でオブジェクトを管理するコレクションです。最後に追加した要素が最初に取り出されるという特性を持つため、履歴管理や「元に戻す(Undo)」機能など、さまざまな場面で活用されています。

Stackクラスは、Pushメソッドで要素を追加し、Popメソッドで要素を取り出すという基本操作で実装されます。主なメソッドは以下の通りです。

番号メソッドと説明
1public virtual void Clear();
スタックからすべての要素を削除します。
2public virtual bool Contains(object obj);
指定した要素がスタック内に存在するかどうかを判定します。
3public virtual object Peek();
スタックの先頭にあるオブジェクトを、削除せずに返します。
4public virtual object Pop();
スタックの先頭にあるオブジェクトを削除して返します。
5public virtual void Push(object obj);
スタックの先頭にオブジェクトを挿入します。
6public virtual object[] ToArray();
スタックの内容を新しい配列にコピーします。

Push操作:要素の追加

Pushメソッドは、スタックの先頭に新しい要素を追加します。追加した順に積み上げられていくイメージです。

Stack st = new Stack();
st.Push('A');
st.Push('B');
st.Push('C');
st.Push('D');

Pop操作:要素の取り出し

Popメソッドは、スタックの先頭から要素を取り除き、その値を返します。LIFO構造により、最後にPushした要素が最初に取り出されます。

サンプルコード

以下は、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

補足:ジェネリック版のStack<T>

上記のSystem.Collections.Stackは非ジェネリック版で、要素はobject型として扱われるため、取り出し時にキャストが必要になります。実際の開発では、型安全なSystem.Collections.Generic.Stack<T>を使用することが推奨されています。基本的なPushPopPeekなどの操作方法は同じです。

  1. C言語におけるスタックを使った後置記法(逆ポーランド記法)の式評価を解説

    スタック(Stack)は線形データ構造の一種で、データの挿入と削除が必ず一端(トップ)からのみ行われるという特徴を持ちます。この「後入れ先出し(LIFO: Last In First Out)」の性質により、式の評価や構文解析など、さまざまな場面で活用されています。 基本アルゴリズム Push(挿入)のアルゴリズム まず、スタックオーバーフローが発生していないかを確認します。 if (top == n-1) printf(stack over flow); オーバーフローしていない場合は、要素をスタックに挿入します。 top++ a[top] = item Pop(削除)のアルゴリズ

  2. C言語で学ぶスタックによる式の変換:中置記法から後置・前置記法への変換アルゴリズム

    スタック(Stack)とは、データの挿入と削除が同じ一端のみで行われる線形データ構造です。この性質を「LIFO(Last In First Out:後入れ先出し)」と呼びます。スタックの基本操作とアルゴリズムPush(プッシュ)のアルゴリズムまず、スタックオーバーフローが発生していないかを確認します。if (top == n-1) printf(stack over flow);オーバーフローでなければ、要素をスタックに挿入します。top++; a[top] = item;Pop(ポップ)のアルゴリズムまず、スタックアンダーフローが発生していないかを確認します。if (top == -