C#

[C#]컬렉션, 스택(Stack) 자료구조

DevStory 2021. 9. 11.

.NET 프레임워크가 제공하는 컬렉션 클래스에서 스택(Stack)을 소개합니다.

 

스택은 먼저 들어온 값이 나중에 나가는 FILO(First In Last Out)이라 부르기도 하며, 나중에 들어온 값이 먼저 나가는 LIFO(Last In First Out)라고 부르는 자료 구조입니다.

 

이론적인 내용은 구글에 검색하면 많이 나오기 때문에 생략하겠습니다.

 

Stack은 ArrayList와 마찬가지로 크기가 자동으로 늘어나며, 타입이 서로 다른 값을 추가할 수 있는 자료 구조입니다.

 

이번 포스팅에서는 스택(Stack) 컬렉션을 다루는 방법을 정리하였습니다.

 


Stack 생성

우선, 컬렉션인 Stack을 사용하기 위해 System.Collections using문에 추가합니다.

using System.Collections;

 

Stack 객체는 일반 객체를 생성하는 방법과 동일하며, var 타입도 가능합니다.

Stack stack1 = new Stack();

var stack2 = new Stack();

 

다음과 같이 Stack의 용량을 생성할 때 설정할 수 있습니다. 만약, 스택에 데이터가 3개가 존재하는데 추가적으로 데이터를 넣는 경우 Stack의 용량이 자동으로 증가합니다.

Stack stack = new Stack(3);

Stack 초기화

Stack 객체의 값을 초기화하는 방법입니다.

int[] arr = { 1, 2, 3, 4, 5 };

Stack stack = new Stack(arr);

생성자에 배열을 넘기면, 배열의 값으로 Stack의 값을 초기화합니다.

 

아래 코드는 객체 stack에 담겨 있는 값을 foreach문으로 출력하는 코드입니다.

int[] arr = { 1, 2, 3, 4, 5 };

Stack stack = new Stack(arr);

foreach (object obj in stack)
{
  Console.WriteLine($"value : {obj }");
}

실행 결과

 

Stack은 ArrayList 또는 배열과 다르게 맨 마지막에 들어간 값부터 출력이 되는데요.

 

Stack은 마지막에 들어온 값부터 접근합니다.

 

배열 arr의 마지막 값은 5입니다.

 

5는 나중에 들어온 값이므로 stack의 최상단에 존재합니다.

 

Stack은 최상단에서 아래로 값을 접근하기 때문에 마지막에 들어간 값부터 출력이 되었습니다.

 

아래는 Stack 객체의 값을 초기화하는 또 다른 방법입니다.

 

Stack 생성자에 object 타입의 배열을 전달하여 값을 초기화합니다.

Stack stack = new Stack(new object[] { 1, "Hi", 5.5, true, 'A', null, " . " });

서로 다른 타입의 값을 Stack에 넣어야 하는 경우 object 타입의 배열을 전달하여 값을 초기화할 수 있습니다.

 

그리고 다음과 같이 ArrayList를 전달하여 값을 초기화할 수 있습니다.

ArrayList arrylist = new ArrayList { 1, "Hi", 5.5, true, 'A', null, " . " };

Stack stack = new Stack(arrylist);

 

참고로 Stack은 ArrayList와는 다르게 컬렉션 이니셜 라이즈 기법을 사용할 수 없습니다.

// ArrayList는 가능
ArrayList arraylist = new ArrayList { 1, "Hi", 5.5, true, 'A', null, " . " };

// Stack은 불가능
Stack stack = new Stack { 1, "Hi", 5.5, true, 'A', null, " . " };

Stack에 값 추가

Push() 메서드를 사용하여 Stack의 맨 위에 값을 추가할 수 있습니다.

 

Stack은 값을 쌓는 구조이므로 Stack의 중간에 값을 추가할 수 없습니다.

Stack stack = new Stack();

stack.Push( 1 );
stack.Push( "2번째" );
stack.Push( 'C' );

 

Push() 메서드가 실행되면 Stack의 구조는 다음 그림과 같습니다.

 

Push() 실행 결과


Stack에 값을 제거

Pop() 메서드를 사용하여 Stack의 맨 위에 값을 제거할 수 있습니다.

 

Push() 메서드와 마찬가지로 중간에 있는 값을 변경할 수 없습니다.

 

Push() 메서드에서 설명한 stack의 값을 제거하는 코드입니다. 

stack.Pop();
stack.Pop();
stack.Pop();

stack.Pop(); // 여기서 에러

 

Pop() 메서드가 실행되면 Stack의 구조는 다음 그림과 같습니다.

 

Pop() 실행 결과

4번째 Pop() 메서드를 호출하는 경우 Stack이 비어 있으므로 에러가 발생합니다.

 

 

Count를 사용하여 Stack이 비어있는지 체크하거나 예외처리를 하는 코드를 작성하도록 합니다.

 

만약, Stack의 모든 값을 제거하는 경우 Clear() 메서드를 사용합니다.

stack.Clear();
반응형

'C#' 카테고리의 다른 글

[C#]제네릭 메서드(Generic Method)  (0) 2021.09.19
[C#]컬렉션, 큐(Queue) 자료구조  (0) 2021.09.11
[C#]컬렉션, ArrayList  (0) 2021.08.28
[C#]DataTable에서 특정 Row만 추출하기  (0) 2021.08.24
[C#]DataTable RowState 강제로 변경  (0) 2021.08.22

댓글