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 중첩된 팝업이 뜰때 마지막 순서부터 먼저 꺼져야 할때
// 큐는 어디 사용 - 네트워크 패킷이 수만개 쌓였을때 줄을 세워서 순차적으로 실행하게 할때 유용하게 사용
}
}
}
C#에서는 System.Collections.Generic 네임스페이스를 사용하여 스택과 큐를 구현할 수 있습니다. 이를 통해 제네릭 타입을 지원하는 스택과 큐를 쉽게 사용할 수 있습니다.
스택은 후입선출(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}");
}
}
}
큐는 선입선출(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}");
}
}
}
스택은 후입선출 방식이기 때문에, 중첩된 팝업 창을 처리할 때 유용합니다. 마지막으로 열었던 팝업 창을 먼저 닫는 방식입니다. 이를 통해 팝업을 관리하고, 사용자가 창을 닫을 때마다 이전 상태로 돌아갈 수 있습니다.
큐는 선입선출 방식이므로, 네트워크 패킷을 처리할 때 유용합니다. 먼저 들어온 패킷이 먼저 처리되므로, 패킷을 순차적으로 처리하는 데 적합합니다.
연결 리스트는 데이터를 노드라는 단위로 연결한 자료구조로, 앞과 뒤의 데이터를 빠르게 추가하거나 삭제할 수 있습니다. C#에서는 LinkedList<T> 클래스를 사용하여 연결 리스트를 구현할 수 있습니다.
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}");
}
}
}
연결 리스트는 스택과 큐와 비슷한 방식으로 동작할 수 있지만, 더 유연한 구조를 제공합니다. 예를 들어, 첫 번째 데이터를 삭제하면 큐처럼, 마지막 데이터를 삭제하면 스택처럼 동작할 수 있습니다.