データ構造-キュー:循環キューとチェーンキューのC++テンプレートクラス実装
6812 ワード
C++テンプレートクラスによる循環キューとチェーンキューの実現
実装される機能:
1.入列、2.列をなすヘッダーを表示します.4.判空、5.判満、6.キューを空にします.7.キューの長さを求めます.
ループキューのテンプレートクラス実装コード:
チェーンキューのテンプレートクラス実装コード:
実装される機能:
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;
}