您的位置:首页 > 产品设计 > UI/UE

模板队列Queue类

2015-06-19 21:07 357 查看
最近,学习了c++中的模板,自己写了一个关于队列类的模板,经过我的测试,它可以用于int ,double,char等类型。

首先,我定义了一个关于顺序队列类的模板,声明了其中的一些函数,用以实现先进先出,入队、出队,判断为空、为满等基本的操作。

<pre name="code" class="cpp"><pre name="code" class="cpp">template<typename T,int num>
class Queue
{
public:
Queue()
:front_(0),rear_(0)
{}
bool isEmpty();//判断是否为空
bool isFull();//判断是否为满
bool push(const T &);
bool pop(T &);
int & getfront()
{
return front_;
}
int & getrear()
{
return rear_;
}
private:
int front_;
int rear_;
T arr_[num];
};



下面是有关这些函数的定义。需要注意的是在类外定义模板类的成员函数时,需要先写template<参数列表>

template<typename T,int num>
bool Queue<T,num>::isEmpty()
{
return (front_ == rear_);
}

template<typename T,int num>
bool Queue<T,num>::isFull()
{
return(rear_ - front_ == num);
}

template<typename T,int num>
bool Queue<T,num>::push(const T &val)//入队
{
if(isFull())
return false;
else
{
arr_[rear_] = val;
rear_ ++;
return true;
}
}

template<typename T,int num>
bool Queue<T,num>::pop(T &val)//出队
{
if(isEmpty())
return false;
else
{
val = arr_[front_];
++front_;
return true;
}
}


为了改进队列类的一些缺点,将队列设为循环队列,这时num 就不是队列的最大容量,而为队列的容量+1.以下为循环队列的模板:

template<typename T,int num>
class MyQueue
{
public:
MyQueue()
{
front_ = rear_ = 0;
};
bool isEmpty()
{
return (front_ == rear_);
}
bool isFull()
{
return ((rear_ + 1) % num == front_);
}
bool push(const T &val)
{
if(isFull())
return false;
else
{
rear_ = (rear_ + 1)%num;
arr_[rear_] = val;
//		std::cout<<rear_<<" ";
return true;
}
}
bool pop(T &val)
{
if(isEmpty())
return false;
else
{
front_ = (front_ + 1) % num;
val = arr_[front_];
//		std::cout<<front_<<" ";
return true;
}
}
int & getfront()
{
return front_;
}
int & getrear()
{
return rear_;
}
private:
int rear_;
int front_;
T arr_[num];
};


以下为我关于所设计的模板队列类的一些测试

int main(void)
{
Queue<int,10>queueInt;
std::cout<<"开始时,是否为空?"<<queueInt.isEmpty()<<std::endl;
queueInt.push(5);
std::cout<<"开始时,是否为空?"<<queueInt.isEmpty()<<std::endl;
std::cout<<"the front = "<<queueInt.getfront()<<",the rear = "<<queueInt.getrear()<<std::endl;

for(int idx = 0; idx != 9;++idx)
{
queueInt.push(idx);
}
std::cout<<"此时,是否为满?"<<queueInt.isFull()<<std::endl;

int rec = 0;
while(queueInt.pop(rec))
{
std::cout<<rec<<" ";
}
std::cout<<std::endl;

MyQueue<char,26>queueChar;//循环队列中最多有num-1个元素
for(char idx = 'a';idx != 'z';idx++)
{
queueChar.push(idx);
}

std::cout<<"queueChar是否为空?"<<queueChar.isEmpty()<<std::endl;
std::cout<<"queueChar是否为满?"<<queueChar.isFull()<<std::endl;

char cval;
while(queueChar.pop(cval))
{
std::cout<<cval<<" ";
}
std::cout<<std::endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  模板类 class