データ構造-キュー:循環キューとチェーンキューのC++テンプレートクラス実装

6812 ワード

C++テンプレートクラスによる循環キューとチェーンキューの実現
実装される機能:
1.入列、2.列をなすヘッダーを表示します.4.判空、5.判満、6.キューを空にします.7.キューの長さを求めます.
ループキューのテンプレートクラス実装コード:
//    ******************************************************************************
#include 

using namespace std;

#define QUEUE_SIZE 100

template 
class CirQueue
{
public:
	CirQueue(){ queue_front = QUEUE_SIZE - 1; queue_rear = QUEUE_SIZE - 1; queue_size = 0; }
	~CirQueue(){}
	void EnQueue(DataType index);
	void DeQueue();
	DataType GetQueue();
	bool Empty(){ if (queue_front == queue_rear) return true; else return false; }
	bool Full(){ if ((queue_rear + 1) % QUEUE_SIZE == queue_front) return true; else  return false; }
	void clearQueue(){ while (queue_front != queue_rear) { data[queue_rear] = 0; queue_rear--; queue_size = 0; } }
	int queue_size;
private:
	DataType data[QUEUE_SIZE];
	int queue_front, queue_rear;
};
template 
void CirQueue::EnQueue(DataType queue_index)//     
{
	if (Full() == true) { std::cout << "    ,    " << std::endl; }
	else
	{
		queue_rear = (queue_rear + 1) % QUEUE_SIZE;     //    
		data[queue_rear] = queue_index;
		queue_size++;
	}
}
template 
void CirQueue::DeQueue()                    //      
{
	if (Empty() == true) std::cout << "    ,    " << std::endl;
	else
	{
		queue_front = (queue_front + 1) % QUEUE_SIZE; //    
		std::cout << "   :" << data[queue_front] << std::endl;
		queue_size--;
	}

}
template 
DataType CirQueue::GetQueue()
{
	if (Empty() == true)
	{
		std::cout << "    ,      " << std::endl;
		return -1;
	}
	else
	{
		int queue_temp = (queue_front + 1) % QUEUE_SIZE;
		std::cout << "   :" << data[queue_temp] << std::endl;
		return data[queue_temp];
	}
}
//   
int main()
{
	CirQueuequeue;

	int select = 10;
	int Item = 0;
	while (select)
	{
		std::cout << std::endl;
		cout << "*****************************" << endl;
		cout << "[1]            [2]      *" << endl;
		cout << "[3]        [4]    *" << endl;
		cout << "[5]                     *" << endl;
		cout << "*****************************" << endl;
		cout << "   :>";
		cin >> select;
		switch (select)
		{
		case 1:
			cout << "        :>";
			cin >> Item; getchar();
			queue.EnQueue(Item);
			cout << Item << "    " << endl;
			break;
		case 2:
			queue.DeQueue();
			break;
		case 3:
			queue.GetQueue();
			break;
		case 4:
			queue.clearQueue();
			cout << "     " << endl;
			break;
		case 5:
			std::cout << "    :" << queue.queue_size << std::endl;
			break;
		default:
			break;
		}
	}

	return 0;
}

チェーンキューのテンプレートクラス実装コード:
//   ******************************************************************************
#include 

using namespace std;

#define QUEUE_SIZE 100

template 
class LinkQueueNode
{
public:
	DataType data;
	LinkQueueNode* next;
};
template 
class LinkQueue
{
public:
	LinkQueue();
	~LinkQueue(){}
	void EnQueue(DataType queue_index);
	void DeQueue();
	DataType GetQueue();
	bool Empty(){ if (queue_front == queue_rear) return true;else return false; }
	void clearQueue();
	int queue_size;
	
private:
	LinkQueueNode *queue_front, *queue_rear;
	DataType queue_first;
};

template 
LinkQueue::LinkQueue()
{
	LinkQueueNode *queue_node = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
	queue_node->next = NULL;
	queue_front = queue_rear = queue_node;
	queue_size = 0;
}

template 
void LinkQueue::EnQueue(DataType queue_index)//     
{
	LinkQueueNode *addNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
	addNode->data = queue_index;
	addNode->next = NULL;
	queue_rear->next = addNode;
	queue_rear = addNode;
	queue_size++;
}

template 
void LinkQueue::DeQueue()                    //      
{
	if ( Empty() ) std::cout << "    ,    " << std::endl;
	else
	{
		DataType queue_x;
		LinkQueueNode *queue_p;
		queue_p = queue_front->next;
		queue_x = queue_p->data;
		queue_front->next = queue_p->next;
		if (queue_p->next == NULL)
			queue_rear = queue_front;
		delete queue_p;
		queue_size--;
		std::cout << "   :" << queue_x << std::endl;
	}
}

template 
DataType LinkQueue::GetQueue()
{
	if (Empty())
	{
		std::cout << "    ,      " << std::endl;
		return -1;
	}
	else
	{
		std::cout << "  :" << queue_front->next->data << std::endl;
		return queue_front->next->data;
	}
}

template 
void LinkQueue::clearQueue()
{
	while (queue_front != queue_rear) 
	{
		DataType queue_x;
		LinkQueueNode *queue_p;
		queue_p = queue_front->next;
		queue_x = queue_p->data;
		queue_front->next = queue_p->next;
		if (queue_p->next == NULL)
			queue_rear = queue_front;
		delete queue_p;
	}
	queue_size = 0;
}
//   
int main()
{
	LinkQueuequeue;

	int select = 10;
	int Item = 0;
	while (select)
	{
	    	std::cout << std::endl;
			cout << "*****************************" << endl;
			cout << "[1]            [2]      *" << endl;
			cout << "[3]        [4]    *" << endl;
			cout << "[5]                     *" << endl;
			cout << "*****************************" << endl;
			cout << "   :>";
			cin >> select;
			switch (select)
			{
			case 1:
				cout << "        :>";
				cin >> Item; getchar();
				queue.EnQueue(Item);
				cout << Item << "    " << endl;
				break;
			case 2:
				queue.DeQueue();
				break;
			case 3:
				queue.GetQueue();
				break;
			case 4:
				queue.clearQueue();
				cout << "     " << endl;
				break;
			case 5:
				cout << "    :" << queue.queue_size << endl;
				break;
			default:
				break;
			}
	}

	return 0;
}