C#, Queue 사용하기
C# 에서는 Queue 를 제공합니다. Queue 구조에 대한 설명은 생략하고 코드만 설명하겠습니다.
Queue<Int32> m_Queue = new Queue<Int32>;
m_Queue.Enqueue(oItem); // 큐에 넣기
item = m_Queue.Dequeue(); // 큐에서 빼기
Queue 의 데이터 갯수 정하기
C# 에서 제공하는 Queue의 크기는 무한대입니다. 크기를 정해 놓고 하려면 Queue를 상속하여 새로운 클래스를 만들어야 합니다.
class MyQueue <T>
{
Queue<T> m_Queue = new Queue<T>();
public Queue<T> oQueue
{
get { return m_Queue; }
set { m_Queue = value; }
}
int iFixedCount = 100; // 100로 고정
T iLastValue;
public MyQueue(int _count)
{
iFixedCount = _count;
}
public Int32 Count
{
get{return m_Queue.Count;}
}
public void Enqueue(T oItem)
{
iLastValue = oItem;
m_Queue.Enqueue(oItem);
if (m_Queue.Count > iFixedCount)
m_Queue.Dequeue();
}
public T LastValue
{
get { return iLastValue; }
}
}
입력값에 따라 여러 개의 Queue 로 분리하기
새로 들어 온 값이 최근에 들어온 값보다 10 이상 클 경우 새로운 큐를 만들어
새로운 큐에 데이터를 넣는 예제입니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*
c#.net의 Queue에 관한 질문입니다.
질문 1
Queue를 생성하게 되면 무한대로 Q의 번지수가 할당이 되는것같은데 100개만 생성하려면 어떻게 해야할까요?
1개의 Q에 100의 공간을 만들고 1번부터 100번까지 다 넣었으면
다시 1번부터 하나씩 덮어쓰는 식으로 하고싶은데 잘 모르겠네요
C#.net에서 제공하는 기본 Queue 컨트롤을 써서 만들고있는데 잘 모르겠네요
질문 2
C#.net을 이용하여 Queue를 생성한 다음 Q에 연속된 숫자들을 집어넣을겁니다.
25342
25343
25344
25345
25347
25349
25350
25352
이런식으로 숫자를 넣을건데 저 숫자들은 다른곳에서 받아서 집어넣을 숫자들입니다.
이 숫자들을 넣으면서 비교를 할건데
새로 Q에 들어올 숫자가 이전의 Q의 숫자와 10 미만 차이가 나면 다음 Q에 저장을 하고
새로들어올 숫자가 10이상이 차이가나면 새로운 Q를 생성하여 그곳에 넣을겁니다.
*/
namespace WATQueue
{
class MyQueue <T>
{
Queue<T> m_Queue = new Queue<T>();
public Queue<T> oQueue
{
get { return m_Queue; }
set { m_Queue = value; }
}
int iFixedCount = 100;
T iLastValue;
public MyQueue(int _count)
{
iFixedCount = _count;
}
public Int32 Count
{
get{return m_Queue.Count;}
}
public void Enqueue(T oItem)
{
iLastValue = oItem;
m_Queue.Enqueue(oItem);
if (m_Queue.Count > iFixedCount)
m_Queue.Dequeue();
}
public T LastValue
{
get { return iLastValue; }
}
}
class Program
{
static void Main(string[] args)
{
// queue 의 리스트
List<MyQueue<Int32>> m_Queues = new List<MyQueue<Int32>>();
// 큐 한개
MyQueue<Int32> m_Queue = new MyQueue<Int32>(100);
// 100 개인지 확인하기
for(int iTemp=0;iTemp<108;iTemp++)
{
m_Queue.Enqueue(iTemp);
}
Console.WriteLine(“m_Queue 의 데이터 수: ” + m_Queue.Count.ToString());
Console.WriteLine(“”);
// 큐 입력에 사용할 데이터
Int16[] iData = new Int16[] { 1, 2, 3, 4, 20, 21, 22, 55,100 };
m_Queue.oQueue.Clear();
Console.WriteLine(” 데이터를 넣습니다.”);
foreach (Int16 iValue in iData)
{
Console.Write(” ” + iValue.ToString());
if(m_Queue.Count == 0)
m_Queue.Enqueue(iValue);
else
{
if(m_Queue.LastValue+10 < iValue)
{
m_Queues.Add(m_Queue);
m_Queue = new MyQueue<Int32>(10);
}
else
{
}
m_Queue.Enqueue(iValue);
}
}
m_Queues.Add(m_Queue);
Console.WriteLine(Environment.NewLine);
Console.WriteLine(“총 m_Queue의 수: ” + m_Queues.Count.ToString());
foreach (MyQueue<Int32> q in m_Queues)
{
Console.WriteLine(” m_Queue의 데이터 수: “+ q.Count.ToString());
}
}
}
}
Queue , List 비교
C# 에서 Queue 와 비슷한 것이 List 인데, List 가 훨씬 막강합니다.
한가지 예로 Queue 의 데이터를 보려면 Enqueue, Dequeue 를 해야만 하지만
List 는 index 를 제공하여 중간중간에 원하는 값을 볼 수 있다.
C# 에서는 Queue 를 제공합니다. Queue 구조에 대한 설명은 생략하고 코드만 설명하겠습니다.
Queue<Int32> m_Queue = new Queue<Int32>;
m_Queue.Enqueue(oItem); // 큐에 넣기
item = m_Queue.Dequeue(); // 큐에서 빼기
List<Int32> m_List = new List<Int32>;
m_List[0];// 1 번째 데이터 접근
m_List[1];// 2 번째 데이터 접근
꼭 Queue 를 사용해야 할 필요가 없다면 List 를 권하고 싶습니다.