Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# Stack.Contains() 메서드 – 스택 내 요소 존재 여부 확인하기

C#의 Stack.Contains() 메서드는 특정 요소가 스택(Stack)에 포함되어 있는지 확인할 때 사용합니다. 요소가 존재하면 true, 존재하지 않으면 false를 반환하며, 내부적으로 처음부터 끝까지 순차 검색(linear search)을 수행하므로 시간 복잡도는 O(n)입니다.

구문

Stack.Contains() 메서드의 기본 구문은 다음과 같습니다.

public virtual bool Contains (object ob);

여기서 매개변수 ob는 스택에서 검색하고자 하는 개체를 의미합니다.

주요 특징

  • 반환 형식: bool — 요소가 스택에 있으면 true, 없으면 false를 반환
  • 비교 방식: Object.Equals() 메서드를 사용하여 요소를 비교
  • 성능: 순차 검색 방식으로 동작하므로 시간 복잡도는 O(n)
  • null 검색: null을 인자로 전달하여 검색하는 것도 가능

예제 1 – 문자열 스택에서 요소 검색

다음 예제에서는 문자열 요소들로 구성된 스택을 생성하고, Push()로 새 요소를 추가한 뒤 Contains() 메서드로 특정 요소의 존재 여부를 확인해 보겠습니다.

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("스택 요소...");
      foreach(string val in stack) {
         Console.WriteLine(val);
      }
      Console.WriteLine("요소 개수 = " + stack.Count);
      Console.WriteLine("Speakers 요소가 스택에 있는가? = " + stack.Contains("Speakers"));
      stack.Push("Headphone");
      stack.Push("Keyboard");
      stack.Push("Earphone");
      Console.WriteLine("\n스택 요소... 업데이트 후");
      foreach(string val in stack) {
         Console.WriteLine(val);
      }
      Console.WriteLine("요소 개수(업데이트 후) = " + stack.Count);
      Console.WriteLine("Alienware 요소가 스택에 있는가? = " + stack.Contains("Alienware"));
      Stack stack2 = (Stack)stack.Clone();
      Console.WriteLine("\n스택 요소... 복제본");
      foreach(string val in stack2) {
         Console.WriteLine(val);
      }
      Console.Write("요소 개수(복제본) = " + stack2.Count);
   }
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

스택 요소...
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
요소 개수 = 7
Speakers 요소가 스택에 있는가? = False

스택 요소... 업데이트 후
Earphone
Keyboard
Headphone
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
요소 개수(업데이트 후) = 10
Alienware 요소가 스택에 있는가? = True

스택 요소... 복제본
Earphone
Keyboard
Headphone
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
요소 개수(복제본) = 10

초기 스택에는 7개의 요소가 저장되어 있으며, "Speakers"는 스택에 존재하지 않으므로 Contains()가 False를 반환했습니다. 이후 Headphone, Keyboard, Earphone 세 요소를 추가하면 개수가 10개로 늘어나고, 이미 존재하는 "Alienware"에 대해서는 True가 반환되는 것을 확인할 수 있습니다.

예제 2 – 정수 스택에서 요소 검색

이번에는 정수형 데이터를 담은 스택으로 동일하게 테스트해 보겠습니다.

using System;
using System.Collections;
public class Demo {
   public static void Main() {
      Stack stack = new Stack();
      stack.Push(150);
      stack.Push(300);
      stack.Push(500);
      stack.Push(750);
      stack.Push(1000);
      stack.Push(1250);
      stack.Push(1500);
      stack.Push(2000);
      stack.Push(2500);
      Console.WriteLine("스택 요소...");
      foreach(int val in stack) {
         Console.WriteLine(val);
      }
      Console.WriteLine("요소 개수 = " + stack.Count);
      Console.WriteLine("750 요소가 스택에 있는가? = " + stack.Contains(750));
      stack.Push(3000);
      Console.WriteLine("\n스택 요소... 업데이트 후");
      foreach(int val in stack) {
         Console.WriteLine(val);
      }
      Console.WriteLine("요소 개수(업데이트 후) = " + stack.Count);
      Console.WriteLine("5000 요소가 스택에 있는가? = " + stack.Contains(5000));
      Stack stack2 = (Stack)stack.Clone();
      Console.WriteLine("\n스택 요소... 복제본");
      foreach(int val in stack2) {
         Console.WriteLine(val);
      }
      Console.Write("요소 개수(복제본) = " + stack2.Count);
   }
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

스택 요소...
2500
2000
1500
1250
1000
750
500
300
150
요소 개수 = 9
750 요소가 스택에 있는가? = True

스택 요소... 업데이트 후
3000
2500
2000
1500
1250
1000
750
500
300
150
요소 개수(업데이트 후) = 10
5000 요소가 스택에 있는가? = False

스택 요소... 복제본
3000
2500
2000
1500
1250
1000
750
500
300
150
요소 개수(복제본) = 10

"750"은 처음부터 스택에 존재했던 값이므로 True가 반환되고, 이후 검색한 "5000"은 스택에 없는 값이기 때문에 False가 반환됩니다. 또한 Clone()으로 복제된 스택도 원본과 동일한 요소 목록과 개수를 유지하는 것을 볼 수 있습니다.

정리

C#의 Stack.Contains() 메서드는 스택에 원하는 값이 들어 있는지 손쉽게 확인할 수 있는 방법입니다. 다만 순차 검색 기반이기 때문에 요소가 많은 스택에서 반복적으로 호출하면 성능 저하가 발생할 수 있으며, 이런 경우에는 HashSet처럼 조회 속도가 빠른 자료구조를 활용하는 것이 좋습니다.