티스토리 뷰

뇌를 자극하는 알고리즘

2016/03/23

애니멀14 2016. 3. 23. 15:44

1. 순환 큐.

1. 순환 큐 클래스.

#include "20160324.h"

void CreateQueue(CircularQueue** _Queue, int _Capacity)
{
#ifdef CPP
	(*_Queue) = new CircularQueue;
	(*_Queue)->tNode = new Node[_Capacity + 1];
#else
	(*_Queue) = (CircularQueue*)malloc(sizeof(CircularQueue));
	(*_Queue)->tNode = (Node*)malloc(sizeof(Node) * (_Capacity + 1);
#endif
	(*_Queue)->nCapacity = _Capacity;
	(*_Queue)->nFront = 0;
	(*_Queue)->nRear = 0;

}

void DestroyQueue(CircularQueue* _Queue)
{
#ifdef CPP
	delete _Queue->tNode;
	_Queue->tNode = NULL;
	delete _Queue;
	_Queue = NULL;
#else
	free(_Queue->tNode);
	_Queue->tNode = NULL;
	free(_Queue);
	_Queue = NULL;
#endif

}

void Enqueue(CircularQueue* _Queue, ElementType _Data)
{
	int nPosition = 0;

	if (_Queue->nRear == _Queue->nCapacity + 1)
	{
		_Queue->nRear = 0;
		nPosition = 0;
	}
	else
		nPosition = _Queue->nRear++;
	_Queue->tNode[nPosition].Data = _Data;

}

ElementType Dequeue(CircularQueue* _Queue)
{
	int nPosition = _Queue->nFront;

	if (_Queue->nFront == _Queue->nCapacity)
		_Queue->nFront = 0;
	else
		_Queue->nFront++;
	return _Queue->tNode[nPosition].Data;

}

int GetSize(CircularQueue* _Queue)
{
	if (_Queue->nFront <= _Queue->nRear)
		return _Queue->nRear - _Queue->nFront;
	else
		return _Queue->nRear + (_Queue->nCapacity - _Queue->nFront) + 1;

}

int IsEmpty(CircularQueue* _Queue)
{
	return (_Queue->nFront == _Queue->nRear);
}

int IsFull(CircularQueue* _Queue)
{
	if (_Queue->nFront < _Queue->nRear)
		return ((_Queue->nRear - _Queue->nFront) == _Queue->nCapacity);
	else
		return ((_Queue->nRear + 1) == _Queue->nFront);

}

2. 메인 클래스.

#include "20160324.h"

#ifdef CPP
using namespace std;
#endif

void main(void)
{
	CircularQueue* Queue;

	CreateQueue(&Queue, 10);

	Enqueue(Queue, 1);
	Enqueue(Queue, 2);
	Enqueue(Queue, 3);
	Enqueue(Queue, 4);

	for (int i = 0; i < 3; ++i)
	{
#ifdef CPP
		cout << "Dequeue : " << Dequeue(Queue) << ", ";
		cout << "Front : " << Queue->nFront << ", Rear : " << Queue->nRear << endl;
#else
		printf("Dequeue : %d, ", Dequeue(Queue));
		printf("Front : %d, Rear : %d\n", Queue->nFront, Queue->nRear);
#endif
	}

	int i = 100;

	while (0 == IsFull(Queue))
		Enqueue(Queue, i++);

#ifdef CPP
		cout << "Capacity : " << Queue->nCapacity << ", Size : " << GetSize(Queue) << endl;
#else
		printf("Capacity : %d, Size : %d\n", Queue->nCapacity, GetSize(Queue));
#endif
	while(0 == IsEmpty(Queue))
	{
#ifdef CPP
		cout << "Dequeue : " << Dequeue(Queue) << ", ";
		cout << "Front : " << Queue->nFront << ", Rear : " << Queue->nRear << endl;
#else
		printf("Dequeue : %d, ", Dequeue(Queue));
		printf("Front : %d, Rear : %d\n", Queue->nFront, Queue->nRear);
#endif
	}
	DestroyQueue(Queue);

}

 

2. 링크드 큐.

1. 링크드 큐 클래스.

#include "20160325.h"

void CreateQueue(LinkedQueue** _Queue)
{
#ifdef CPP
	(*_Queue) = new LinkedQueue;
#else
	(*_Queue) = (LinkedQueue*)malloc(sizeof(LinkedQueue));
#endif
	(*_Queue)->Front = NULL;
	(*_Queue)->Rear = NULL;
	(*_Queue)->nCount = 0;

}

void DestroyQueue(LinkedQueue* _Queue)
{
	while(!IsEmpty(_Queue))
	{
		Node* Pop = Dequeue(_Queue);
		DestroyNode(Pop);
	}

#ifdef CPP
	delete _Queue;
#else
	free(_Queue);
#endif

}

Node* CreateNode(ElementType NewData)
{
#ifdef CPP
	Node* NewNode = new Node;
	NewNode->Data = NewData;
#else
	Node* NewNode = (Node*)malloc(sizeof(Node));
	NewNode->Data = (ElementType)malloc(sizeof(strlen(NewData) + 1);

	strcpy_s(NewNode->Data, sizeof(strlen(NewData) + 1), NewData);
#endif

	NewNode->NextNode = NULL;

	return NewNode;
}

void DestroyNode(Node* _Node)
{
#ifdef CPP
	delete _Node;
	_Node = NULL;
#else
	free(_Node->Data);
	_Node->Data = NULL;
	free(_Node);
	_Node = NULL;
#endif

}

void Enqueue(LinkedQueue* _Queue, Node* _NewNode)
{
	if (NULL == _Queue->Front)
	{
		_Queue->Front = _NewNode;
		_Queue->Rear = _NewNode;
		_Queue->nCount++;
	}
	else
	{
		_Queue->Rear->NextNode = _NewNode;
		_Queue->Rear = _NewNode;
		_Queue->nCount++;
	}

}

Node* Dequeue(LinkedQueue* _Queue)
{
	Node* Front = _Queue->Front;

	if (NULL == _Queue->Front->NextNode)
	{
		_Queue->Front = NULL;
		_Queue->Rear = NULL;
	}
	else
		_Queue->Front = _Queue->Front->NextNode;
	_Queue->nCount--;

	return Front;

}

int IsEmpty(LinkedQueue* _Queue)
{
	return (NULL == _Queue->Front);

}

2. 메인 클래스.

#include "20160325.h"

#ifdef CPP
using namespace std;
#endif

void main(void)
{
	LinkedQueue* Queue;

	CreateQueue(&Queue);

	Enqueue(Queue, CreateNode("aaa"));
	Enqueue(Queue, CreateNode("bbb"));
	Enqueue(Queue, CreateNode("ccc"));
	Enqueue(Queue, CreateNode("ddd"));

#ifdef CPP
	cout << "Queue Size : " << Queue->nCount << endl;
#else
	printf("Queue Size : %d\n", Queue->nCount);
#endif
	Node* Pop;

	while(0 == IsEmpty(Queue))
	{
		Pop = Dequeue(Queue);

#ifdef CPP
		cout << "Dequeue : " << Pop->Data << endl;
#else
		printf("Dequeue : %s\n", Pop->Data);
#endif
		DestroyNode(Pop);
	}
	DestroyQueue(Queue);

}

 

'뇌를 자극하는 알고리즘' 카테고리의 다른 글

2016/03/22  (0) 2016.03.22
2016/03/21  (0) 2016.03.21
댓글
공지사항