模板队列Queue类

最近,学习了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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值