//公示化描述的队列类Queue
#include <iostream>
using namespace std;
//FIIFO对象
template <class T>
class Queue{
public:
Queue(int MaxQueueSize=10);
~Queue(){delete []queue;}
bool IsEmpty()const{return front==rear;}
bool IsFull()const{return (((rear+1)%MaxSize==front)?true:false);}
T First()const; //返回队首元素
T Last()const; //返回队尾元素
Queue<T>& Add(const T&x);
Queue<T>& Delete(T&x);
void Output();
private:
int front; //与第一个元素在反时针方向上相差一个位置
int rear; //指向最后一个元素
int MaxSize; //队列数组的大小
T *queue; //数组
};
class OutOfBounds{
public:
OutOfBounds(){
cout<<"Out Of Bounds!"<<endl;
}
};
//内存不足的异常类
class NoMem{
public:
NoMem(){
cout<<"No Memory!"<<endl;
}
};
//创建一个容量为MaxQueueSize的空队列
template<class T>
Queue<T>::Queue(int MaxQueueSize){
MaxSize = MaxQueueSize +1;
queue = new T[MaxSize];
front = rear = 0;
};
//该队列的输出方法
template<class T>
void Queue<T>::Output(){
for(int i = front+1;i<=rear;i++){
cout<<queue[i]<<" "<<endl;
}
}
//返回队列的第一个元素
//若队列为空则返回异常
template <class T>
T Queue<T>::First()const{
if(IsEmpty())
throw OutOfBounds();
return queue((front+1)%MaxSize);
}
//返回队列的最后一个元素
//若队列为空则返回异常
template <class T>
T Queue<T>::Last()const{
if(IsEmpty())
throw OutOfBounds();
return queue(rear);
}
//添加一个新的成员
//注意:因为rear==front无法判断出队列是空还是满
//所以将front的数值是头位置的前一个数字
//所以队列的最大空间为MaxSize-1
template<class T>
Queue<T>& Queue<T>::Add(const T&x){
if(IsFull())
throw NoMem();
rear = (rear+1)%MaxSize;
queue[rear] = x;
return *this;
}
template<class T>
Queue<T>& Queue<T>::Delete(T&x){
if(IsEmpty())
throw OutOfBounds();
front = (front+1)%MaxSize;
x = queue[front];
return *this;
}
void main(){
Queue<int>myQueue(10);
myQueue.Add(5);
myQueue.Add(2);
myQueue.Add(0);
myQueue.Add(1);
myQueue.Add(3);
myQueue.Add(1);
myQueue.Add(4);
myQueue.Output();
int temp;
myQueue.Delete(temp);
myQueue.Delete(temp);
myQueue.Delete(temp);
myQueue.Output();
}
[C++]数据结构:公式化描述的队列Queue类
最新推荐文章于 2024-07-23 20:22:16 发布