본문 바로가기

스터디/C#.NET:자료

C#, Queue 사용하기

 

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 를 권하고 싶습니다.