头文件queue.h
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>
using namespace std;
const int QUEUESIZE = 100;
template <class DataType>
class CirQueue
{
private:
DataType* data;//指向队列存储空间
int front;//队首下标
int rear;//队尾下标
int mSize;//存放队列的数组大小
static int queuelength;
public:
CirQueue();//建立缺省长度(QUEUESIZE)的队列
CirQueue(int size);//建立长度为size的队列
~CirQueue();//清空队列,释放内存
bool enQueue(DataType item);//入队
bool deQueue(DataType *item);//出队
bool getQueue(DataType &item);//读取队头元素
bool isEmpty();//判断队列是否为空
bool isFull();//判断队列是否为满
void clearQueue();//清空队列
void displayQueue();//显示队列内容
int queueLength();//获取队列元素个数
};
template<class DateType>
int CirQueue<DateType>::queuelength = 0; //记录数组有效内容长度
template <class DataType>
CirQueue<DataType>::CirQueue()
{
mSize = QUEUESIZE;
front = 0;
rear = 0;
data = new DataType[mSize];
}
template <class DataType>
CirQueue<DataType>::CirQueue(int size)
{
mSize = size;
front = 0;
rear = 0;
data = new DataType[mSize];
}
template <class DataType>
CirQueue<DataType>::~CirQueue()
{
delete[] data;
}
template <class DataType>
bool CirQueue<DataType>::enQueue(DataType item)
{
if (isFull()) {
return false;
}
rear = (rear + 1) % QUEUESIZE;
data[rear] = item;
cout << data[rear] << endl;
queuelength++;
return true;
}
template <class DataType>
bool CirQueue<DataType>::deQueue(DataType *item)
{
if (isEmpty()) {
return false;
}
front = (front + 1) % QUEUESIZE;
*item = data[front];
queuelength--;
return true;
}
template <class DataType>
bool CirQueue<DataType>::getQueue(DataType &item)
{
if (isEmpty()) {
return false;
}
int i = (front + 1) % QUEUESIZE;
item = data[i];
return true;
}
template <class DataType>
bool CirQueue<DataType>::isEmpty()
{
if (front == rear) {
return true;
}
else {
return false;
}
}
template <class DataType>
bool CirQueue<DataType>::isFull()
{
if ((rear + 1) % QUEUESIZE == front) {
return true;
}
else {
return false;
}
}
template <class DataType>
void CirQueue<DataType>::clearQueue()
{
front = rear;
}
template <class DataType>
void CirQueue<DataType>::displayQueue()
{
int p = (front + 1)% QUEUESIZE;//指向第一个有用的数据
do{
cout << data[p] << " ";
} while ((p++)% QUEUESIZE != rear);
cout << endl;
}
template <class DataType>
int CirQueue<DataType>::queueLength()
{
return queuelength;
}
typedef CirQueue<char> charCirQueue;
#endif
主程序queue.cpp
#include <iostream>
#include "queue.h"
using namespace std;
int main()
{
charCirQueue s1(10);
char a;
s1.enQueue('a');
s1.enQueue('b');
s1.enQueue('c');
cout << s1.queueLength() << endl;
s1.displayQueue();
s1.deQueue(&a);
cout << a << endl;
cout << s1.queueLength() << endl;
s1.clearQueue();
cout << s1.queueLength() << endl;
return 0;
}