循环队列模板类(支持动态扩展 | 仿std::vector::resize 静态扩展)

//顺序循环队列 ADT实现
#include <iostream>
#include <algorithm>
using namespace std;

#define maxn 10
#define f 2
//类声明
//ADT 
template <class T>
class Queue{
	public:
		virtual ~Queue(){};
		virtual bool empty()const = 0;
		virtual int size()const = 0;
		virtual T& front() = 0;
		virtual T& back() = 0;
		virtual void pop() = 0;
		virtual void push(const T& elem) = 0;
};
//seqQue
template <class T>
class seqQue: public Queue<T>{
	 public:
	 	seqQue(int iniC = maxn);
		~seqQue();
		virtual bool empty() const override ; 
				bool full() const override ;
		virtual int size() const override ;
		virtual T& front() override;
		virtual T& back() override;
		virtual void pop() override;
		virtual void push(const T& elem) override;
		
		void reMalloc();
		int pFr;
		int pR;
		
		int S;
		int C;
		
		T* Que;
}; 
template <class T>
seqQue<T>::seqQue(int iniC)
{
	C = iniC;
	pFr = pR = -1;
	S = 0;
	Que = new T[C];
}
template <class T>
seqQue<T>::~seqQue(){delete[] Que;};
template <class T>
bool seqQue<T>::full()const{return (pR+1)%C==pFr;}
//Another Possible Policy:
/*
    1 record queueSize
	2 set a tag to record last operation(push or pop) to distinguish full or empty
*/
template <class T>
bool seqQue<T>::empty()const{return pFr == pR;}
template <class T> 
int seqQue<T>::size()const{return S;}
template <class T>
T& seqQue<T>::front()
{
	if(!empty()){
		return Que[pFr+1];
	}else throw "empty";
}
template <class T>
T& seqQue<T>::back()
{
	if(!empty()){
		return Que[pR];
	}else throw "empty";	
}
template <class T>
void seqQue<T>::pop()
{
	if(empty()){
		throw "empty";
	}else{
		pFr = (pFr+1)%C;
		//逻辑删除 
	}
}
template <class T>
void seqQue<T>::reMalloc()
{
	T* nQue = new T[f*C];
	int beg = (pFr+1)%C;
	if(beg < 2)//pFr < 1 -->pFr == 0 or -1:队列未形成循环
	{
		copy(Que+beg,Que+S-1,nQue);//iptF_Iter,iptL_Iter 
	}else
	{
		copy(Que+beg,Que+C,nQue);
		copy(Que,Que+pR,nQue+C-beg+2);//S = C-1;
	} 
	C*=f;
	delete[] Que;
	Que = nQue;
	pFr = -1;
	pR = S-1;
}
template <class T>
void seqQue<T>::push(const T& elem)
{
	if(full())
	{
		reMalloc();	
	}
	pR = (pR+1)%C;
	Que[pR] = elem;
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XNB's Not a Beginner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值