针对顺序队列在出队时需要移动大量元素,或者是浪费空间等问题,实现了基本的循环队列。当然这里实现的循环队列也存在缺陷,就是需要提前定义好大小。
#include <iostream>
using namespace std;
#define MAXSIZE 5
typedef int DataType;
struct SqQueueCy
{
DataType* base;
int front;
int rear;
};
//队列的初始化
bool SqQueueCyInit(SqQueueCy& Q)
{
Q.base = (DataType*)malloc(MAXSIZE * sizeof(DataType));
if (!Q.base)
{
cout << "malloc init error" << endl;
return false;
}
Q.front = Q.rear = 0;
return true;
}
//队列销毁
bool SqQueueCyDestroy(SqQueueCy& Q)
{
free(Q.base);
Q.base = NULL;
Q.front = Q.rear = 0;
return true;
}
//队列清空
bool SqQueueCyClear(SqQueueCy& Q)
{
Q.front = Q.rear = 0;
return true;
}
//队列是否为空
bool SqQueueCyEmpty(SqQueueCy Q)
{
if (Q.rear == Q.front)
return true;
else
return false;
}
//队列的长度
int SqQueueCyLength(SqQueueCy Q)
{
return ((Q.rear - Q.front + MAXSIZE) % MAXSIZE);
}
//获取队列队头
bool SqQueueCyGetHead(SqQueueCy Q,DataType& e)
{
if (Q.front == Q.rear)
return false;
e = Q.base[Q.front];
return true;
}
//入队
bool SqQueueCyInsert(SqQueueCy& Q, DataType e)
{
//为了区分队满和队空
if ((Q.rear + 1) % MAXSIZE == Q.front)
return false;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXSIZE;//因为队列是循环的,所以要取余,不然会溢出;
return true;
}
//出队
bool SqQueueCyDelete(SqQueueCy& Q, DataType& e)
{
if (Q.front == Q.rear)
return false;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXSIZE; //因为队列是循环的,所以要取余,不然会溢出;
}
void SqQueueCyTraverse(SqQueueCy Q,void(*visit)(DataType))
{
while (Q.front < Q.rear)
{
visit(Q.base[Q.front]);
Q.front++;
}
cout << endl;
}
void visit(DataType c)
{
cout << " " << c;
}
void main()
{
DataType e0;
SqQueueCy Q;
SqQueueCyInit(Q);
cout << "向队列中插入元素为:";
for (int i = 1; i <= 5; i++)
{
SqQueueCyInsert(Q, i);
}
SqQueueCyTraverse(Q, visit);
cout << "此时队列的长度为:" << SqQueueCyLength(Q) << endl;
SqQueueCyGetHead(Q, e0);
cout << "队列的队头为:" << e0 << endl;
SqQueueCyDelete(Q, e0);
cout << "队头出队后,队列的长度为:" << SqQueueCyLength(Q) << endl;
cout << "队头出队后,队列元素为:";
SqQueueCyTraverse(Q, visit);
SqQueueCyClear(Q);
cout << "清空队列后,队列的长度为:" << SqQueueCyLength(Q) << endl;
system("pause");
}
本文介绍了一种解决顺序队列出队时需移动大量元素或浪费空间问题的方法——循环队列,并提供了详细的C++实现代码。包括队列的初始化、销毁、清空等操作及如何判断队列是否为空、获取队列长度、队头元素等。
202

被折叠的 条评论
为什么被折叠?



