C# スタックとプッシュおよびポップの例

⚡ スマートサマリー

C# のスタックは、System.Collections 名前空間のコレクションであり、後入れ先出し (LIFO) の原則に従います。Push メソッドは要素を先頭に追加し、Pop メソッドは要素を削除します。

  • 📚 LIFOの概念: スタックは本の山のように機能するため、最後に押し込まれた要素が最初に取り除かれる要素となる。
  • ➕ 押してポップする: Pushメソッドはスタックの一番上に要素を追加し、Popメソッドはその一番上の要素を削除して返します。
  • 👀 覗き見、数える、含む: Peek メソッドは最上位の要素を削除せずに読み取りますが、Count と Contains メソッドはサイズとメンバーシップを報告します。
  • 🧪 具体的な例題: 2 つのコンソール プログラムでは、カウントと Contains を使用したプッシュ、次にポップを実演します。 tracLIFO順序で。
  • 🛠️ 汎用スタック: スタックSystem.Collections.Generic のクラスは、コンパイル時の型安全性を追加し、新しい C# コードのボックス化を回避します。
  • 🤖 AI支援: GitHub CopilotはC#スタック操作をスキャフォールディングし、ML.NETは非ジェネリックスタックではなく型付きコレクションを通してデータを読み取ります。

C# スタック

C# のスタックとは何ですか?

スタックは、後入れ先出し (LIFO) の概念を表す特殊なケースのコレクションです。 まず LIFO を理解するために、例を見てみましょう。 各本が互いの上に置かれた本の山を想像してください。

本の場合の後入れ先出しの概念は、本のスタックから一番上の本だけを削除できることを意味します。 間の本を取り出すことはできません。そうすると、スタックの設置が妨げられるためです。

したがって C#スタックも同様に機能します。要素はスタックに重ねて追加されます。スタックに要素を追加するプロセスは、プッシュ操作と呼ばれます。スタックから要素を削除するには、スタックの最上位の要素を削除することもできます。この操作はポップと呼ばれます。

Stack コレクションで使用できる操作を詳しく見てみましょう。

スタックの宣言

スタックは、Stack Data タイプを使用して作成されます。 キーワード「new」は、スタックのオブジェクトを作成するために使用されます。 次に、オブジェクトは変数 st に割り当てられます。

Stack st = new Stack()

スタックへの要素の追加

Push メソッドは、要素をスタックに追加するために使用されます。 ステートメントの一般的な構文を以下に示します。

Stack.push(element)

スタックからの要素の削除

popメソッドはスタックから要素を削除するために使用されます。pop操作はスタックの最上位の要素を返します。ステートメントの一般的な構文は次のとおりです。

 Stack.pop()

数量カウント

このプロパティは、スタック内のアイテムの数を取得するために使用されます。 以下は、このステートメントの一般的な構文です。

Stack.Count

含まれています

このメソッドは、要素がスタックに存在するかどうかを確認するために使用されます。 以下は、このステートメントの一般的な構文です。 このステートメントは、要素が存在する場合は true を返し、それ以外の場合は値 false を返します。

Stack.Contains(element)

次に、これがコードレベルで動作することを見てみましょう。 以下のコードはすべて、 コンソールアプリケーション。 コードは Program.cs ファイルに書き込まれます。

以下のプログラムでは、上記のメソッドをどのように使用できるかを確認するコードを記述します。

例 1: Stack.Push() メソッド

この例では、次のようになります。

  • スタックの作成方法。
  • スタックの要素を表示する方法、および Count メソッドと Contain メソッドを使用する方法。

C# でスタックする

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);

   foreach (Object obj in st)
   {
    Console.WriteLine(obj);
   }
    Console.WriteLine(); Console.WriteLine();
    Console.WriteLine("The number of elements in the stack " +st.Count);
    Console.WriteLine("Does the stack contain the elements 3 "+st.Contains(3));
    Console.ReadKey();
  }
 }
}

Code 説明:-

  1. 最初のステップはスタックを宣言するために使用されます。 ここでは、スタックの要素を保持する変数として「st」を宣言しています。
  2. 次に、スタックに 3 つの要素を追加します。 各要素は Push メソッドを介して追加されます。
  3. 現在、スタック要素にはインデックス位置を介してアクセスできないため、 配列リスト、スタックの要素を表示するには、別のアプローチを使用する必要があります。 オブジェクト (obj) は一時変数であり、スタックの各要素を保持するために宣言されます。 次に、foreach ステートメントを使用して、スタックの各要素を調べます。 各スタック要素の値は obj 変数に割り当てられます。 次に、Console.Writeline コマンドを使用して値をコンソールに表示します。
  4. Count プロパティ (セントカウント) スタック内のアイテムの数を取得します。 このプロパティは数値を返します。 次に、この値をコンソールに表示します。
  5. 次に、Contains メソッドを使用して、値 3 がスタックに存在するかどうかを確認します。 これは、true または false の値を返します。 次に、この戻り値をコンソールに表示します。

上記のコードが正しく入力され、プログラムが実行されると、次の出力が表示されます。

出力:

C# でスタックする

出力から、スタックの要素が表示されていることがわかります。また、スタックに値 3 が定義されていることを示すために、True の値が表示されています。

お願い: スタックにプッシュされた最後の要素が最初に表示されることに気付いたでしょう。これがスタックの最上位の要素です。スタック要素の数も出力に表示されます。

例 2: Stack.Pop() メソッド

次に、「削除」機能を見てみましょう。 スタックから最上位の要素を削除するために必要なコードを見てみましょう。

C# でスタックする

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);
   
   st.Pop();

   foreach (Object obj in st)
   {
    Console.WriteLine(obj);
   }
    Console.ReadKey();
  }
 }
}

Code 説明:-

  1. ここでは、スタックから要素を削除するために使用される Pop メソッドを発行するだけです。

上記のコードを正しく入力してプログラムを実行すると、次の出力が表示されます。

出力:

C# でスタックする

要素 3 がスタックから削除されたことがわかります。

C# Stack Peek() メソッド

PushメソッドとPopメソッドはスタックの最上位要素に対して機能しますが、最上位要素を削除せずにその内容だけを確認したい場合もあります。Peekメソッドはまさにそのような場合に役立ちます。コレクションを変更せずにスタックの最上位値を返すため、次の要素を削除する前にテストしたい場合に便利です。

ステップ1) スタックを作成し、そこに3つの要素をプッシュして、値3が一番上になるようにします。

ステップ2) Peek メソッドを呼び出して最上位の要素を読み取り、Count プロパティを確認して何も削除されていないことを確認します。

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);
   Console.WriteLine(st.Peek());
   Console.WriteLine(st.Count);
   Console.ReadKey();
  }
 }
}

Code 説明:-

  1. st という名前のスタックが宣言され、Push メソッドを使用して値 1、2、3 が追加され、3 が最上位の要素になります。
  2. Peek メソッドは最上位の要素を削除せずに返しますが、Count プロパティはスタック内のアイテムの総数を返します。

プログラムを実行すると、値が出力されます。 3 ピークからカウント 3これは、要素がスタック上に残ることを証明します。スタックが空の場合、Peek は Invalid をスローします。OperationException が発生する可能性があるため、呼び出し前に Count をチェックしても安全です。

汎用スタックC#で

上記の例では、System.Collections の非ジェネリックな Stack クラスを使用しており、各要素をオブジェクトとして格納しています。現代の C# コードでは、通常、ジェネリックな Stack が好まれます。 System.Collections.Generic 名前空間のクラスです。スタックを単一の宣言型にバインドするため、コンパイラはすべての Push と Pop をチェックし、キャストやボックス化は不要です。

汎用スタックの主な利点以下にリストされています。

  • 型式安全性: 型は宣言時に固定されるため、その型の値のみがプッシュ可能であり、エラーはコンパイル時に検出されます。
  • ボクシングなし: intなどの値型は直接格納されるため、非ジェネリックスタックが負担するボックス化コストを回避できます。
  • クリーナーの読み方: PopとPeekは宣言された型を直接返すため、結果をオブジェクトからキャストし直す必要はありません。
using System;
using System.Collections.Generic;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack<string> st = new Stack<string>();
   st.Push("Java");
   st.Push("Python");
   Console.WriteLine(st.Pop());
   Console.ReadKey();
  }
 }
}

この例ではスタックは Stack として宣言されていますそのため、文字列値のみを受け入れます。Pop メソッドは文字列を直接返して出力します。 Python最後にプッシュされた値。新しいプロジェクトの場合、汎用スタック推奨される選択肢です。

C#におけるスタックとキューの違い

スタックと キュー スタックとキューはどちらも要素の削除順序を制御するコレクションですが、ルールが正反対です。スタックは後入れ先出し(LIFO)方式、キューは先入れ先出し(FIFO)方式です。適切なキューを選択することで、コードの意図を他の開発者に明確に伝えることができます。

主な違いは以下のとおりです。

  • 注文: スタックは最後に追加された要素から順に削除する(LIFO)のに対し、キューは最も古い要素から順に削除する(FIFO)。
  • メソッド: スタックはプッシュとポップを使用するのに対し、キューはエンキューを使用して追加し、デキューを使用して削除します。
  • トップ要素へのアクセス: スタックはピーク機能を使って次の項目を読み取り、キューはピーク機能を使って先頭から次の項目を読み取ります。
  • 一般的な用途: スタックは、アンドゥ機能、式評価、および再帰に対応しています。 tracキングはスケジューリング、バッファリング、幅優先探索に適している一方、キューはスケジューリング、バッファリング、幅優先探索に適している。

どちらのタイプもスタックとして汎用的に利用可能ですそしてキューSystem.Collections.Generic では、どちらの選択肢を選んでも型安全性が確保されます。

よくあるご質問

空のスタックに対して Pop または Peek を呼び出すと、無効なエラーが発生します。OperationException が発生します。まず Count プロパティを確認するか、スタックに要素がない場合に例外をスローする代わりに false を返す汎用スタック メソッド TryPop および TryPeek を使用してください。

PushとPopはどちらもスタックの最上位にしかアクセスしないため、実行時間は定数O(1)です。内部配列を拡張する必要がある場合は、時折Pushによってサイズが変更されますが、操作あたりの平均コストは一定のままです。

いいえ。スタックはPeekとPopを通じて最上位要素のみを公開するため、リストのようなインデックスアクセサはありません。すべての値を読み取るには、foreachループでスタックを列挙するか、ToArrayメソッドを使用してコピーする必要があります。

Clear メソッドは、スタックからすべての要素を一度に削除し、Count をゼロにリセットします。代わりに、スタックの先頭から要素を 1 つずつ削除するには、Count がゼロになるまでループで Pop メソッドを呼び出します。

標準の Stack クラスは、複数のスレッドが同時に変更を加える場合、書き込みに対してスレッドセーフではありません。同時アクセスには、System.Collections.Concurrent の ConcurrentStack を使用してください。ConcurrentStack は、外部ロックを使用しないアトミックな TryPush メソッドと TryPop メソッドを提供します。

ToArray メソッドを呼び出すと、スタックが上から下へ順序付けられた新しい配列にコピーされます。また、スタックを List コンストラクタに渡して、汎用リストを構築しながら、ping 同じ順序。

はい。GitHub Copilotは、短いコメントまたはメソッド名から、スタック宣言、プッシュ/ポップ呼び出し、およびforeachループを生成します。新しいC#コードでは汎用的なスタック形式が推奨されているため、多くの場合、汎用的なスタック形式が提案されます。

スタックは、型付きコレクションと IDataView パイプラインを介して流れる ML.NET トレーニング データを格納することはめったにありません。しかし、LIFO スタックの概念は、バック バック バックの機械学習アルゴリズム内で現れます。tracキング、深さ優先探索、および再帰メソッド呼び出しの管理。