数据结构--循环顺序队列C++(模板类实现)
作者:
AmbitionX
,
2022-05-03 14:49:49
,
所有人可见
,
阅读 268
/*
由于顺序队列和循环顺序队列的实现差不多,故只写出顺序顺序队列用以复习普通的顺序队列和循环顺序队列
*/
#include <iostream>
using namespace std;
const int QueueSize = 100;
template <typename DataType>
class CirQueue
{
public:
CirQueue(); // 初始化空队列
// ~CirQueue(); // 析构函数,静态存储 自己会去除,函数为空
void EnQueue(DataType x); // 入队操作
DataType DeQueue(); // 出队操作
DataType GetHead(); // 取对头操作
void Empty(); // 判空操作
private:
DataType data[QueueSize]; // 存放队列元素的数组
int front, rear; // 游标,对头和队尾指针
};
template <typename DataType>
CirQueue<DataType>:: CirQueue()
{
rear = front = QueueSize - 1;
}
// 入队操作
template <typename DataType>
void CirQueue<DataType>:: EnQueue(DataType x)
{
if ((rear + 1) % QueueSize == front) throw "上溢";
rear = (rear + 1) % QueueSize; // 对尾指针在循环的意义下+1
data[rear] = x; //插入元素
}
// 出队操作
template <typename DataType>
DataType CirQueue<DataType>:: DeQueue()
{
if (rear == front) throw "下溢";
front = (front + 1) % QueueSize; // 对头在循环的意义下+1
return data[front]; // 返回队头元素
}
// 取对头操作
template <typename DataType>
DataType CirQueue<DataType>:: GetHead()
{
if (rear == front) throw "下溢";
return data[(front) + 1 % QueueSize];
}
// 判空操作
template <typename DataType>
void CirQueue<DataType>:: Empty()
{
if (rear == front) cout << "队空" << endl;
else cout << "队不空" << endl;
}
int main()
{
CirQueue<int> Q{ };
cout << "1 和 2 入队";
Q.EnQueue(1);
Q.EnQueue(2);
cout << "当前对头的元素为: " << Q.GetHead() << endl;
int x;
try
{
x = Q.DeQueue(); // 出队
cout << "出队操作,出来的元素是: " << x << endl;
}
catch (char *str)
{
cout << str << endl;
}
int y;
try
{
cout << "请输入待入队元素: ";
cin >> y;
cout << "待入队元素为: " << y << endl;
Q.EnQueue(y); // 入队
}
catch (char *str)
{
cout << str << endl;
}
Q.Empty();
return 0;
}