본문 바로가기
Program Language/C#

Part3. C# 실력다지기(5. Stack<T> - 자료 구조의 이해와 활용)

by 토담이아빠 2023. 12. 14.

Stack<T>-자료구조의 이해와 활용

 

안녕하세요, 토담이아빠입니다. 오늘은 우리 모두가 알아야 할 핵심 자료 구조 중 하나인 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

이 코드는 문자열로 주어진 표현식에서 괄호가 균형을 이루고 있는지 검사합니다. 열린 괄호는 스택에 추가되고, 닫힌 괄호가 나타날 때마다 스택의 최상단 요소(가장 최근에 추가된 열린 괄호)를 제거하여 짝을 맞춥니다. 모든 검사가 끝난 후 스택이 비어있으면 괄호가 균형을 이루는 것으로 판단합니다.

댓글