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

C#のStack.Peek()メソッドとは?基本の使い方とサンプルコードを解説

Stack.Peek()メソッドとは

C#のStack.Peek()メソッドは、System.Collections名前空間のStackクラスに用意されたメソッドで、スタックの先頭(トップ)にあるオブジェクトを削除せずにそのまま返すために使用します。

似た動作をするPop()メソッドは、先頭要素を取得したうえでスタックから取り除きます。一方、Peek()は要素を残したまま値を参照できるため、「スタックの一番上に何があるかを確認したいだけ」という場面で便利です。

なお、スタックが空の状態でPeek()を呼び出すとInvalidOperationExceptionがスローされる点には注意が必要です。呼び出し前にCountプロパティで要素数を確認しておくと安全です。

構文

Stack.Peek()メソッドの構文は以下のとおりです。

public virtual object Peek();
  • 引数:なし
  • 戻り値:スタックの先頭にあるオブジェクト(object型)

使用例1:基本的な使い方

まずは基本となるサンプルです。Push()メソッドで複数の要素を追加したスタックに対してPeek()を呼び出し、先頭要素を取得しています。さらに要素を追加した後に再度Peek()を呼び出し、先頭要素が変化することも確認できます。

using System;
using System.Collections;

public class Demo {
   public static void Main() {
      Stack stack = new Stack();
      stack.Push("Inspiron");
      stack.Push("Alienware");
      stack.Push("Projectors");
      stack.Push("Monitors");
      stack.Push("XPS");
      stack.Push("Laptop");
      stack.Push("Notebook");

      Console.WriteLine("Stack elements...");
      foreach(string val in stack) {
         Console.WriteLine(val);
      }
      Console.WriteLine("Count of elements = "+stack.Count);
      Console.WriteLine("Element at the top = "+ stack.Peek());

      stack.Push("Ultrabook");
      stack.Push("Cameras");
      stack.Push("Keyboards");

      Console.WriteLine("\nStack elements...updated");
      foreach(string val in stack) {
         Console.WriteLine(val);
      }
      Console.WriteLine("Element at the top = "+ stack.Peek());
      Console.WriteLine("\nCount of elements (updated) = "+stack.Count);

      stack.Clear();
      Console.Write("Count of elements (updated) = "+stack.Count);
   }
}

実行結果

このプログラムを実行すると、次のような出力が得られます。

Stack elements...
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
Count of elements = 7
Element at the top = Notebook

Stack elements...updated
Keyboards
Cameras
Ultrabook
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
Element at the top = Keyboards
Count of elements (updated) = 10
Count of elements (updated) = 0

コードのポイント

  • スタックはLIFO(Last In First Out:後入れ先出し)構造のため、foreachでの列挙順序は追加した順序と逆になります。最後に追加した「Notebook」が最初に表示されます。
  • 7個の要素がある初期状態では、Peek()の戻り値は「Notebook」です。
  • 「Ultrabook」「Cameras」「Keyboards」を追加した後は、先頭要素が「Keyboards」に変わり、要素数も10に増えています。
  • Clear()メソッドを呼び出すとすべての要素が削除され、要素数は0になります。

使用例2:Contains()・Clone()との組み合わせ

次に、Contains()メソッドによる特定要素の存在確認や、Clone()メソッドによるスタックの複製と組み合わせた例を紹介します。Clone()で複製したスタックに対しても、Peek()で先頭要素を取得できます。

using System;
using System.Collections;

public class Demo {
   public static void Main() {
      Stack stack = new Stack();
      stack.Push("Inspiron");
      stack.Push("Alienware");
      stack.Push("Projectors");
      stack.Push("Monitors");
      stack.Push("XPS");
      stack.Push("Laptop");
      stack.Push("Notebook");

      Console.WriteLine("Stack elements...");
      foreach(string val in stack) {
         Console.WriteLine(val);
      }
      Console.WriteLine("Count of elements = "+stack.Count);
      Console.WriteLine("Element Speakers is the stack? = "+stack.Contains("Speakers"));

      stack.Push("Headphone");
      stack.Push("Keyboard");
      stack.Push("Earphone");

      Console.WriteLine("\nStack elements...updated");
      foreach(string val in stack) {
         Console.WriteLine(val);
      }
      Console.WriteLine("Count of elements (updated) = "+stack.Count);
      Console.WriteLine("Element Alienware is the stack? = "+stack.Contains("Alienware"));

      Stack stack2 = (Stack)stack.Clone();
      Console.WriteLine("\nStack elements...cloned");
      foreach(string val in stack2) {
         Console.WriteLine(val);
      }
      Console.Write("Count of elements (updated) = "+stack2.Count);
      Console.WriteLine("Top of the Stack = "+stack2.Peek());
   }
}

実行結果

このプログラムを実行すると、次のような出力が得られます。

Stack elements...
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
Count of elements = 7
Element Speakers is the stack? = False

Stack elements...updated
Earphone
Keyboard
Headphone
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
Count of elements (updated) = 10
Element Alienware is the stack? = True

Stack elements...cloned
Earphone
Keyboard
Headphone
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
Count of elements (updated) = 10Top of the Stack = Earphone

コードのポイント

  • Contains("Speakers")は、スタックに「Speakers」が存在しないためFalseを返します。
  • 「Headphone」「Keyboard」「Earphone」を追加した後も既存の要素はそのまま保持されており、Contains("Alienware")はTrueを返します。
  • Clone()メソッドで作成した複製スタック(stack2)に対してもPeek()が利用でき、先頭要素である「Earphone」を取得できます。

まとめ

C#のStack.Peek()メソッドは、スタックの先頭要素を削除せずに取得できる便利なメソッドです。要素を取り除きたい場合はPop()を使い、確認だけしたい場合はPeek()を使う、というように適切に使い分けましょう。また、空のスタックに対してPeek()を呼び出すと例外が発生するため、必要に応じてCountプロパティで要素数をチェックしてください。

  1. C#のAggregateメソッドとは?配列要素を集計・演算する方法を解説

    C#のLINQに用意されているAggregate(集計)メソッドを使うと、Sum(合計)、Min(最小値)、Max(最大値)、Average(平均)といった数学的な演算を柔軟に実装できます。Aggregateメソッドは、ラムダ式で指定した処理をシーケンスの各要素に順番に適用し、最終的に1つの結果へと集約します。ここでは、配列の全要素を掛け合わせる例を通して、その使い方を見ていきましょう。サンプル:配列要素の積を求めるまずは、次のような整数型の配列を用意します。int[] arr = { 10, 15, 20 };この配列に対して、Aggregate()メソッドを次のように呼び出します。 x *

  2. C#のTakeWhileメソッドの使い方をわかりやすく解説

    C#のLINQに用意されているTakeWhile()メソッドを使うと、Predicate(述語)で指定した条件が成立している間、シーケンスの先頭から要素を取得することができます。 このメソッドは、条件を満たす限り先頭から順に要素を取り出し、最初に条件を満たさなくなった要素に到達した時点で処理を停止するという特徴があります。そのため、配列の途中に条件外の要素があると、それ以降の要素はたとえ条件を満たしていても取得されない点に注意が必要です。 TakeWhile()メソッドの基本的な使い方 まず、整数型の配列を宣言して初期化します。 int[] arr = { 25, 40, 65, 70 };