#ifndef SEQQUEUE_H
#define SEQQUEUE_H
#include <iostream>
#include <assert.h>
using namespace std;
template<class T>
class SeqQueue
{
public:
SeqQueue(int sz = 10);
~SeqQueue()
{
delete []elements;
}
bool EnQueue(const T& x); //若队列不满,则将x进队,否则队溢出处理
bool DeQueue(T& x); //若队列不空,则退出队头元素x并由函数返回true,否则队空,返回false
bool GetFront(T& x)const; //若队列不空,则函数返回true及队头元素的值,否则返回false
void MakeEmpty() //置空操作,队头和队尾指针置为
{
front = rear = 0;
}
bool IsEmpty()const
{
return (front == rear) ? true : false;
}
bool IsFull()const
{
return ((rear + 1) % maxSize == front) ? true : false;
}
int GetSize()const //求队列元素的个数
{
return (rear - front + maxSize) % maxSize;
}
template<class T>
friend ostream& operator<<(ostream& os,SeqQueue<T>& q);
private:
int front,rear; //队头和队尾指针
T *elements; //存放队元素的数组
int maxSize; //队列最大可容纳元素个数
};
template<class T>
SeqQueue<T>::SeqQueue(int sz /* = 10 */):front(0),rear(0),maxSize(sz)
{
elements = new T[maxSize];
assert(elements != NULL);
}
template<class T>
bool SeqQueue<T>::EnQueue(const T &x)
{
if(IsFull() == true)
return false;
elements[rear] = x;
rear = (rear + 1) % maxSize; //队尾指针加
return true;
}
template<class T>
bool SeqQueue<T>::DeQueue(T& x)
{
if(IsEmpty() == true)
return false;
x = elements[front];
front = (front + 1) % maxSize;
return true;
}
template<class T>
bool SeqQueue<T>::GetFront(T &x)const
{
if(IsEmpty() == true)
return false;
x = elements[front];
return true;
}
template<class T>
ostream& operator<<(ostream& os,SeqQueue<T>& q)
{
os<<"front="<<q.front<<",rear="<<q.rear<<endl;
for(int i = q.front;i != q.rear;i = (i + 1) % q.maxSize)
os<<i<<":"<<q.elements[i]<<endl;
return os;
}
#endif