본문 바로가기
게임 개발(유니티)/멋쟁이 사자처럼 3기_회고록

[멋쟁이사자처럼 유니티 TIL] 2024_12_04(수) 강의 요약 및 정리(1)

by goraku97 2024. 12. 4.

스택(Stack)

싱글 링크드 리스트와 유사하지만, 스택은 tail 부터 시작함. 주로 실행취소,

돌아가기(컨트롤 z)등을 구현할 때 사용됨.

public class StackNode<T>{}

// 클래스의 이름은 StackNode 이며, 제네릭 타입 T을 사용했음

 - public T data;

     // 노드가 저장할 T 데이터

 - public StackNode<T> prev;

    // 이전 노드를 가리키는 참조

 

public class StackCustom<T> where T : new(){}

// 클래스의 이름은 StackCustom 이며, 제네릭 타입 T을 사용했음

- where T : new():

 T는 기본 생성자를 가져야 한다는 제약 조건.

( where T : new()  가 없으면, 제네릭 타입 T를 사용하는 코드에서 기본 생성자(new T())

  를 호출하려고 하면 컴파일 오류가 발생)

 

public StackNode<T> top;

// 스택의 최상단 노드를 가리키는 참조

 

public void Push(T data)

// 제네릭 타입 T데이터를(T data) 데이터를 스택에 추가하는 작업을 수행

 

var stackNode = new StackNode<T>();

// 새로운 노드를 생성해서 var stackNode 에 할당

stackNode.data = data;

// 노드에 데이터 저장

stackNode.prev = top;

// 현재 스택의 최상단(top)을 새로운 노드의 prev로 설정

top = stackNode;

// 새로운 노드(stackNode)를 스택의 최상단으로 설정

public T Pop()

// 스택의 최상단 데이터(top)를 제거하고 반환시키는 메서드

 

if (top == null) 

// 스택이 비어 있으면(top == null) 하기의 코드를 실행.

- return new T()

// 제네릭 타입 T에 대해 기본 생성자를 호출하여 새로운 인스턴스를 생성

 

var result = top.data;

top = top.prev;

return result;

// 최상단 노드의 데이터(top.data;)를, 결과(result) 에 반환

// 최상단 노드를 이전 노드로 변경

 

public T Peek()

//스택에서 최상단에 있는 데이터(top)를 조회하는 함수

 

if (top == null) 

// 스택이 비어 있으면(top == null) 하기의 코드를 실행.

- return new T()

// 제네릭 타입 T에 대해 기본 생성자를 호출하여 새로운 인스턴스를 생성

 

return top.data;

// 스택의 최상단 데이터를 반환

 

public bool AreBreaketBalanced(string expression)

// AreBreaketBalanced라는 메서드는 문자열(expression)을 입력받아,

   그 안에 있는 괄호들이 짝이 맞는지 확인.

 

Stack<char> stack = new Stack<char>();

// Stack<char>는 문자형(char) 데이터를 저장하는 스택이며, 

  스택을 초기화시킴

 

foreach (char c in expression)

// expression 문자열의 각 문자를 순차적으로 확인

// foreach 반복문을 통해 expression에 포함된 각 문자를 하나씩 c라는 변수에 담아 반복

 

if (c == '(' || c == '[' || c == '{')

// c가 여는 괄호 '(', '[', 또는 '{' 중 하나인 경우 하기의 코드를 실행

 { stack.Push(c); }

// 스택에 그 문자를 push하여 넣음

 

else if (c == ')' || c == ']' || c == '}')

// c가 닫는 괄호 ')', ']', 또는 '}' 중 하나인 경우 하기의 코드를 실행

if (stack.Count == 0) return false;

// 스택이 비어 있다면(stack.Count == 0), 

    여는 괄호가 없다는 의미이므로 즉시 false를 반환( return false; )

 

char top = stack.Pop();

// 스택에서 최상단 노드를 제거하고( stack.Pop() ) 그 값을 반환

if ((c == ')' && top == '(') || (c == ']' && top == '[') || (c == '}' && top == '{'))

// 반환된 top 값과 현재 닫는 괄호 c를 비교하여 ture면 하기의 코드를 실행

return false;

// false 값을 반환하고, 함수를 종료시킴.

 

return stack.Count == 0;

// 문자열의 모든 문자를 순회한 후, 스택이 비어 있는지 확인

  ** 스택에 남아 있는 여는 괄호가 있다면, 해당 여는 괄호에 대한 짝이 맞는

   닫는 괄호가 없었다는 의미이므로 false를 반환

  **  스택이 비어 있다면 모든 괄호가 짝을 이룬 것이므로 true를 반환