队列——顺序存储结构及其基本运算(循环队列的另外一种表达方式)

问题描述:对于循环队列来讲,若是知道队头指针和队列中元素个数,则能够计算出队尾指针。也就是说,能够用队列中元素个数代替队尾指针。设计出这种循环队列的进队、出队、判队空和求队中元素个数的算法。ios

示例代码:算法

#include <iostream>
using namespace std;
const int MaxSize = 5;			//队大小
template <typename T>
class SqQueueClass2				//循环队列类模板
{
	T *data;
	int front;					//队头
	int count;					//队中元素个数
public:
	SqQueueClass2();			//构造函数,用于队列初始化
	~SqQueueClass2();			//析构函数,用于释放空间
	bool QueueEmpty();			//判断队列是否为空
	bool enQueue(T e);			//进队列算法
	bool deQueue(T &e);			//出队列算法
	int GetCount();				//求队列中元素个数

};
template <typename T>
SqQueueClass2<T>::SqQueueClass2()	//构造函数,用于队列初始化
{
	data = new T[MaxSize];
	front = 0;
	count = 0;
}
template <typename T>
SqQueueClass2<T>::~SqQueueClass2()	//析构函数,用于释放空间
{
	delete[] data;
}
template <typename T>
bool SqQueueClass2<T>::QueueEmpty()	//判断队列是否为空
{
	return (count == 0);
}
template <typename T>
bool SqQueueClass2<T>::enQueue(T e)	//进队列算法
{
	int rear1;
	rear1 = (front + count) % MaxSize;
	if (count == MaxSize) return false;//队满上溢出
	rear1 = (rear1 + 1) % MaxSize;
	data[rear1] = e;
	count++;
	return true;
}
template <typename T>
bool SqQueueClass2<T>::deQueue(T &e)//出队列算法
{
	if (count == 0) return false;		//队空下溢出
	front = (front + 1) % MaxSize;
	e = data[front];
	count--;
	return true;
}
template <typename T>
int SqQueueClass2<T>::GetCount()	//求队列中元素个数
{
	return count;
}

void main()
{	
	SqQueueClass2<char> sq;			//定义一个字符顺序队sq
	char e;
	cout << "创建一个空队sq\n";
	cout << "队sq" << (sq.QueueEmpty()?"空":"不空") << endl;
	cout << "元素a进队\n"; sq.enQueue('a');
	cout << "元素b进队\n"; sq.enQueue('b');
	cout << "元素c进队\n"; sq.enQueue('c');
	cout << "元素d进队\n"; sq.enQueue('d');
	cout << "元素e进队\n"; sq.enQueue('e');
	cout << "队sq" << (sq.QueueEmpty()?"空":"不空") << endl;
	cout << "全部元素出队次序:";
	while (!sq.QueueEmpty())		//队不空循环
	{
		sq.deQueue(e);				//出队元素e
		cout << e << " ";			//输出元素e
	}
	cout << endl;
	cout << "销毁队sq" << endl;
}