(1)建立循环队列并实现判空、入队、出队、取队头元素等基本操作;
(2)在主函数中测试循环队列的基本操作:
要求:
1)输入一个序列入队,然后再显示队列的内容;
2)显示队头元素;
3)出队一个元素后,再显示队列内容。
main.cpp
#include<iostream>
using namespace std;
#include"CircQueue.h"
template<class ElemType>
void Show(const ElemType &e)
{
cout << e << " ";
}
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
CircQueue<int>CQ(10);
bool T = true;
int b;
//入队前判空
T=CQ.Empty();
cout << "入队前判空:" << T << endl;
//入队
for (int i = 0; i < 9; i++)
CQ.InQueue(a[i]);
//显示队列内容
CQ.Traverse(Show);
//入队后判空
T = CQ.Empty();
cout<< "入队后判空:" << T << endl;
//显示队头元素
CQ.GetHead(b);
cout << "队头元素为:" << b << endl;
//出队一个元素后显示队列内容
//出队
CQ.outQueue();
//显示队列内容
CQ.Traverse(Show);
return 0;
}
CircQueue.h
#pragma once
#include<iostream>
using namespace std;
//循环队列类模板
template<class ElemType>
class CircQueue
{
protected:
//数据成员
ElemType* elems;
int maxSize;
int front, rear;
int count;
public:
CircQueue(int size);
virtual ~CircQueue();
int Length()const;
bool Empty()const;
void Clear();
void Traverse(void (*visit)(const ElemType&))const;
bool outQueue(ElemType &e);
bool outQueue();
bool GetHead(ElemType& e)const;
bool InQueue(const ElemType& e);
};
template<class ElemType>
CircQueue<ElemType>::CircQueue(int size)
{
maxSize = size;
elems = new ElemType[maxSize];
rear = front = 0;
count = 0;
}
template<class ElemType>
CircQueue<ElemType>::~CircQueue()
{
delete[]elems;
}
template<class ElemType>
int CircQueue<ElemType>::Length()const
{
return count;
}
template<class ElemType>
bool CircQueue<ElemType>::Empty()const
{
return count == 0;
}
template<class ElemType>
void CircQueue<ElemType>::Clear()
{
rear = front = 0;
count = 0;
}
template<class ElemType>
void CircQueue<ElemType>::Traverse(void (*visit)(const ElemType&))const
{
cout << "遍历队列:" << endl;
for (int temPos = front; temPos != rear; temPos = (temPos + 1) % maxSize)
{
(*visit)(elems[temPos]);
}
cout << endl;
}
template<class ElemType>
bool CircQueue<ElemType>::outQueue(ElemType& e)
{
if (!Empty())
{
e = elems[front];
front = (front + 1) % maxSize;
count--;
return true;
}
else
{
return false;
}
}
template<class ElemType>
bool CircQueue<ElemType>::outQueue()
{
if (!Empty())
{
front = (front + 1) % maxSize;
count--;
return true;
}
else
{
return false;
}
}
template<class ElemType>
bool CircQueue<ElemType>::GetHead(ElemType& e)const
{
if (!Empty())
{
e = elems[front];
return true;
}
else
{
return false;
}
}
template<class ElemType>
bool CircQueue<ElemType>::InQueue(const ElemType& e)
{
if (count==maxSize)
{
return false;
}
else
{
elems[rear] = e;
rear = (rear + 1) % maxSize;
count++;
return true;
}
}