전체 코드

namespace Exercise
{
    internal class Program
    {
        // 스택      : 후입선출 (Last in First out)
        // 큐        : 선입선출 (First in First out)
        static void Main(string[] args)
        {
            // 
            Stack<int> stack = new Stack<int>();
            
            // 어떤 인터페이스를 제공하나?
            stack.Push(101);
            stack.Push(102);
            stack.Push(103);
            stack.Push(104);
            stack.Push(105);

            // 데이터가 없으면 크래시남
            // 크기 체크를 해주면 좋음
            int data = stack.Pop(); 
            int data2 = stack.Peek();

            Queue<int> queue = new Queue<int>();

            queue.Enqueue(101);
            queue.Enqueue(102);
            queue.Enqueue(103);
            queue.Enqueue(104);
            queue.Enqueue(105);

            int data3 = queue.Dequeue();
            int data4 = queue.Peek();

            // 기존  링크드리스트에서 제공하는 기능이 아닌가?
            // ex
            LinkedList<int> list = new LinkedList<int>();
            list.AddLast(101);
            list.AddLast(102);
            list.AddLast(103);

            // FIFO
            int value1 = list.First.Value;
            list.RemoveFirst();


            // LIFO
            int value2 = list.Last.Value;

            list.RemoveLast();

            // 스택이나 큐가 의사소통 및 추상적으로 사용하기 편하다.
            // 동적배열과 연결리스트의 축소판

            // 뭘로 만들까?

            // 스택은 리스트로 만들기 좋음
            // 상수시간에 넣었다 뺄 수 있음 뒤에 저장 되는것에 한해서

            // 보통은 순환 버퍼를 구현하는 느낌으로 구현

            // 스택과 큐가 게임 만드는데 사용될까?

            // 스택은 어디 사용? 모바일게임의 UI 중첩된 팝업이 뜰때 마지막 순서부터 먼저 꺼져야 할때

            // 큐는 어디 사용 - 네트워크 패킷이 수만개 쌓였을때 줄을 세워서 순차적으로 실행하게 할때 유용하게 사용
        }
    }
}

스택(Stack)과 큐(Queue)의 차이점

  • 스택(Stack): 후입선출(LIFO, Last In First Out) 방식입니다. 즉, 가장 나중에 넣은 데이터가 가장 먼저 나옵니다.
  • 큐(Queue): 선입선출(FIFO, First In First Out) 방식입니다. 즉, 가장 먼저 넣은 데이터가 가장 먼저 나옵니다.

스택과 큐의 사용 사례

  • 스택: 최근에 열었던 팝업 창을 먼저 닫는 UI 구현, 브라우저의 뒤로 가기 기능
  • : 네트워크 패킷 처리, 고객 대기열 처리, 작업 큐

2. C#에서 스택과 큐 구현

C#에서는 System.Collections.Generic 네임스페이스를 사용하여 스택과 큐를 구현할 수 있습니다. 이를 통해 제네릭 타입을 지원하는 스택과 큐를 쉽게 사용할 수 있습니다.

2.1. 스택(Stack) 구현

스택은 후입선출(LIFO) 방식으로 데이터를 처리합니다. C#의 Stack<T> 클래스를 사용하면 쉽게 스택을 구현할 수 있습니다.

스택 사용 예시

using System;
using System.Collections.Generic;

namespace StackAndQueueExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 스택 생성
            Stack<int> stack = new Stack<int>();

            // 데이터 삽입
            stack.Push(101);
            stack.Push(102);
            stack.Push(103);
            stack.Push(104);
            stack.Push(105);

            // Pop: 가장 최근에 넣은 데이터 105를 반환하고 삭제
            int data1 = stack.Pop(); // 105
            Console.WriteLine($"Pop: {data1}");

            // Peek: 가장 최근에 넣은 데이터 104를 반환하지만 삭제하지 않음
            int data2 = stack.Peek(); // 104
            Console.WriteLine($"Peek: {data2}");
        }
    }
}

주요 메서드

  • Push(): 데이터를 스택에 삽입합니다.
  • Pop(): 가장 최근에 삽입된 데이터를 꺼내고 삭제합니다. 비어 있는 스택에서 호출하면 예외가 발생합니다.
  • Peek(): 가장 최근에 삽입된 데이터를 꺼내지만, 삭제하지 않습니다.

2.2. 큐(Queue) 구현

큐는 선입선출(FIFO) 방식으로 데이터를 처리합니다. C#의 Queue<T> 클래스를 사용하여 큐를 구현할 수 있습니다.

큐 사용 예시

using System;
using System.Collections.Generic;

namespace StackAndQueueExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 큐 생성
            Queue<int> queue = new Queue<int>();

            // 데이터 삽입
            queue.Enqueue(101);
            queue.Enqueue(102);
            queue.Enqueue(103);
            queue.Enqueue(104);
            queue.Enqueue(105);

            // Dequeue: 가장 먼저 넣은 데이터 101을 반환하고 삭제
            int data3 = queue.Dequeue(); // 101
            Console.WriteLine($"Dequeue: {data3}");

            // Peek: 가장 먼저 넣은 데이터 102를 반환하지만 삭제하지 않음
            int data4 = queue.Peek(); // 102
            Console.WriteLine($"Peek: {data4}");
        }
    }
}

주요 메서드

  • Enqueue(): 데이터를 큐의 뒤에 삽입합니다.
  • Dequeue(): 가장 먼저 삽입된 데이터를 꺼내고 삭제합니다. 비어 있는 큐에서 호출하면 예외가 발생합니다.
  • Peek(): 가장 먼저 삽입된 데이터를 꺼내지만, 삭제하지 않습니다.

3. 스택과 큐의 응용

3.1. 스택 응용: 중첩 팝업 창 처리

스택은 후입선출 방식이기 때문에, 중첩된 팝업 창을 처리할 때 유용합니다. 마지막으로 열었던 팝업 창을 먼저 닫는 방식입니다. 이를 통해 팝업을 관리하고, 사용자가 창을 닫을 때마다 이전 상태로 돌아갈 수 있습니다.

3.2. 큐 응용: 네트워크 패킷 처리

큐는 선입선출 방식이므로, 네트워크 패킷을 처리할 때 유용합니다. 먼저 들어온 패킷이 먼저 처리되므로, 패킷을 순차적으로 처리하는 데 적합합니다.


4. 연결 리스트(LinkedList)와 그 활용

연결 리스트는 데이터를 노드라는 단위로 연결한 자료구조로, 앞과 뒤의 데이터를 빠르게 추가하거나 삭제할 수 있습니다. C#에서는 LinkedList<T> 클래스를 사용하여 연결 리스트를 구현할 수 있습니다.

4.1. 연결 리스트 사용 예시

using System;
using System.Collections.Generic;

namespace LinkedListExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 연결 리스트 생성
            LinkedList<int> list = new LinkedList<int>();

            // 데이터 삽입
            list.AddLast(101);
            list.AddLast(102);
            list.AddLast(103);

            // 첫 번째 값 반환 및 삭제
            int value1 = list.First.Value;
            list.RemoveFirst();
            Console.WriteLine($"First: {value1}");

            // 마지막 값 반환 및 삭제
            int value2 = list.Last.Value;
            list.RemoveLast();
            Console.WriteLine($"Last: {value2}");
        }
    }
}

4.2. 연결 리스트의 특징

  • AddLast(): 리스트의 끝에 데이터를 추가합니다.
  • First.Value: 리스트의 첫 번째 노드의 값을 반환합니다.
  • Last.Value: 리스트의 마지막 노드의 값을 반환합니다.
  • RemoveFirst(): 리스트에서 첫 번째 노드를 삭제합니다.
  • RemoveLast(): 리스트에서 마지막 노드를 삭제합니다.

연결 리스트는 스택과 큐와 비슷한 방식으로 동작할 수 있지만, 더 유연한 구조를 제공합니다. 예를 들어, 첫 번째 데이터를 삭제하면 큐처럼, 마지막 데이터를 삭제하면 스택처럼 동작할 수 있습니다.


profile
李家네_공부방

0개의 댓글