C++テンプレートによる汎用キューの実現
2118 ワード
ここではC++テンプレートを用いて汎用キューを実現し,その原理は配列を用いて循環キューを実現することである.次のコードを参照してください.
ヘッダファイル
CPPファイル中
ヘッダファイル
#pragma once
#ifndef __AQUEUE
#define __AQUEUE
// ,
template
class Aqueue
{
public:
Aqueue();
Aqueue(size_t size);
~Aqueue();
//
bool empty();
//
T get_head();
//
T push_back(T e);
//
T pop();
//
void clear();
private:
//
bool resize(size_t inc);
private:
T *queue;//
size_t size;//
size_t length;//
size_t rear;//
size_t front;//
};
#endif
CPPファイル中
#include "Aqueue.h"
#include
#include
template
Aqueue::Aqueue()
{
queue = new T;
rear = 0;
front = 0;
size = 1;
length = 0;
}
template
Aqueue::~Aqueue()
{
delete[] queue;
}
//
template
bool Aqueue::empty()
{
return size>0;
}
//
template
T Aqueue::get_head()
{
if (length > 0)
{
return queue[front];
}
else
{
throw std::invalid_argument(" ");
}
}
//
template
T Aqueue::push_back(T e)
{
if (((rear + 1) % size) == front)
resize(size);
queue[rear] = e;
length++;
rear = (rear + 1) % size;
return e;
}
//
template
T Aqueue::pop()
{
int e;
if (length > 0)
{
e = *head;
front = (front + 1) % size;
return e;
}
else
{
throw std::invalid_argument(" ");
}
}
//
template
void Aqueue::clear()
{
delete[] queue;
queue = new T;
rear = 0;
front = 0;
size = 1;
length = 0;
}
//
template
bool Aqueue::resize(size_t inc)
{
T *temp= new T[size + inc];
size_t n = 0;
while (n != length)
{
temp[n] = queue[(front + n) % size];
n++;
}
T *del = queue;
queue = temp;
front = 0;
rear = length;//rear=length
size = size + inc;//
delete[] del;
return true;
}