안녕하세요, 토담이아빠입니다. 오늘은 우리 모두가 알아야 할 핵심 자료 구조 중 하나인 Stack<T>에 대해 알아보겠습니다. 스택을 잘 이해하고 활용하는 것은 C# 개발의 기초를 단단히 하는 데 정말 중요하답니다.
Stack<T>이란 무엇일까요?
스택은 '후입선출(Last In, First Out, LIFO)' 원칙을 따르는 자료 구조입니다. 생각해보면 일상에서도 많이 접할 수 있습니다. 예를 들어, 책 더미에서 맨 위의 책을 먼저 꺼내는 것과 같습니다.
C#에서 Stack<T>는 제네릭 컬렉션의 일부로, 여러분이 어떤 타입의 객체든지 스택에 저장할 수 있게 해줍니다. 타입에 대해서 걱정할 필요가 없으니 타입 안전성이 높아집니다.
간단한 Stack<T> 예제
이제 Stack<T>를 어떻게 사용하는지 한번 보여드리겠습니다. 아래 코드는 문자열을 저장하는 스택을 만들고 사용하는 예제입니다.
using System;
using System.Collections.Generic;
public class Example
{
public static void Main()
{
Stack<string> books = new Stack<string>();
books.Push("위대한 개츠비");
books.Push("1984");
books.Push("앵무새 죽이기");
Console.WriteLine(books.Pop()); // "앵무새 죽이기"
Console.WriteLine(books.Peek()); // "1984"
Console.WriteLine(books.Count); // 2
}
}
실행결과
앵무새 죽이기
1984
2
여기서 Push 메소드는 새로운 항목을 스택에 추가하고, Pop 메소드는 가장 최근에 추가된 항목을 스택에서 제거하며 반환합니다. Peek 메소드는 스택의 맨 위 항목을 반환하지만 제거하지는 않습니다.
스택의 활용
스택은 프로그래밍에서 매우 다양하게 활용됩니다. 예를 들어, 실행 취소 기능, 괄호 검사, 깊이 우선 탐색(DFS) 알고리즘 등에서 주로 사용됩니다. 그 중 하나의 예제로, 괄호의 균형이 맞는지 검사하는 괄호 검사코드를 소개하겠습니다. 이 예제는 스택의 후입선출(LIFO) 특성을 활용하여 열린 괄호와 닫힌 괄호가 올바르게 짝지어져 있는지 확인합니다.
괄호 균형 검사 예제
using System;
using System.Collections.Generic;
public class BalancedBrackets
{
public static bool AreBracketsBalanced(string expression)
{
Stack<char> stack = new Stack<char>();
foreach (char ch in expression)
{
if (ch == '(' || ch == '[' || ch == '{')
{
stack.Push(ch); // 열린 괄호를 스택에 추가
}
else if (ch == ')' || ch == ']' || ch == '}')
{
if (stack.Count == 0)
return false; // 스택이 비어있다면 균형이 맞지 않음
char top = stack.Pop(); // 스택에서 가장 최근 괄호를 제거
if ((top == '(' && ch != ')') ||
(top == '[' && ch != ']') ||
(top == '{' && ch != '}'))
{
return false; // 괄호의 종류가 맞지 않으면 균형이 맞지 않음
}
}
}
return stack.Count == 0; // 스택이 비어있다면 모든 괄호가 균형을 이룸
}
public static void Main()
{
string expression = "{[()]}";
Console.WriteLine(AreBracketsBalanced(expression)); // true 출력
expression = "{[(])}";
Console.WriteLine(AreBracketsBalanced(expression)); // false 출력
}
}
실행결과
True
False
이 코드는 문자열로 주어진 표현식에서 괄호가 균형을 이루고 있는지 검사합니다. 열린 괄호는 스택에 추가되고, 닫힌 괄호가 나타날 때마다 스택의 최상단 요소(가장 최근에 추가된 열린 괄호)를 제거하여 짝을 맞춥니다. 모든 검사가 끝난 후 스택이 비어있으면 괄호가 균형을 이루는 것으로 판단합니다.
'Program Language > C#' 카테고리의 다른 글
Part3. C# 실력다지기(4. LinkedList 이해하기) (5) | 2023.07.15 |
---|---|
Part3. C# 실력 다지기(3. dynamic형 사용하기) (15) | 2023.04.07 |
Part3. C# 실력 다지기(2. 제네릭 클래스 이해하기) (16) | 2023.03.27 |
Part3. C# 실력 다지기(1. 제네릭 메소드 이해하기) (20) | 2023.03.15 |
Part2. C# 기초 다지기(14. params 키워드) (22) | 2023.03.11 |
댓글