在上一篇中我和大家说的是一种不能重复使用的队列,接下来我和大家讲的是可以循环使用的队列!
其实循环队列的定义和前面所讲的差不多,但是为了队列的循环使用;在每一次插入元素时,对尾指针的操作进行了改动,
即每插入一个元素我们就=={ L->rear=(L->rear+1)%Maxsize ;}——"%"运算符的作用我在上一篇已经和大家讲述过;然后每一个元素出队我们就=={L->front=(L->front+1)%Maxsize;}——;在判断队列是否为满时我们就=={ (L->rear+1)%Maxsize==L->front ;};
总得改处大概就这三个地方和无法循环使用的队列相比,下面是具体的代码段可能多一点但是可以直接粘贴复制到编译器中的,运行环境是vc2010教育版,有需要的可以扫码进群或者加我qq:2105442847(加备注:CSDN):
#include<iostream>
#include<stdio.h>
#include<string>
#define MaxSize 5
//队列练习
typedef struct _Queue {
int queue[MaxSize];//定义队列的最大长度
int front; //头指针(此指针并非真正的指针)
int rear; //尾指针(此指针并非真正的指针)
}Squeue;
bool IsFull(Squeue* L); //函数声明
//初始化一个空的队列
void InitQueue(Squeue* L)
{
if (!L) return;
L->front = L->rear = 0;
}
//入队操作
bool goQueue(Squeue* L, int a)
{
//判断队列是否进行了初始化
if (!L) return false;
//IsFull(L)函数实现在外部,作用是判断队列是否为满
if (IsFull(L)) {
return false;
}
L->queue[L->rear] = a;
//此处大家可以自行演示一下,总之就是对队列的最大长度取模
L->rear = (L->rear + 1) % MaxSize;
return true;
}
//判断队列是否为满
bool IsFull(Squeue* L)
{
if (!L) return false;
//这里L->rear+1的原因是在队列中头指针和尾指针相隔一个空位
if ((L->rear + 1) % MaxSize == L->front)
{
std::cout << "队列已满!" << std::endl;
return true;
}
return false;
}
//判断队列是否为空·
bool IsEmpty(Squeue* L)
{
if (!L) return false;
if (L->front ==L->rear)
{
std::cout << "只是一个空队列!" << std::endl;
return true;
}
return false;
}
//打印队列中的元素
void printfQueue(Squeue* L)
{
if (!L) return;
int i = L->front;
while (i!= L->rear)
{
std::cout <<"\t"<< L->queue[i];
i = (i + 1) % MaxSize;
}
std::cout<<std::endl;
}
//出队操作
bool outQueue(Squeue* L)
{
if (!L|| IsEmpty(L)) return false;
int date = L->queue[L->front];
L->front = (L->front + 1) % MaxSize;
std::cout << "出队的值为:"<<date << std::endl;
return true;
}
int main(void) {
//创建一个空的空的队列
Squeue *QL = new Squeue;
//初始化一个空的队列
InitQueue(QL);
int n,a;
//入队操作
std::cout << "请输入要入队的个数:";
std::cin >> n;
for (int i = 0; i < n; i++)
{
std::cout << "请输入要入队的值:";
std::cin >> a;
if (goQueue(QL, a)) {
std::cout << "插入成功!" << std::endl;
}
else {
std::cout << "插入失败!" << std::endl;
}
}
printfQueue(QL);
//出队操作
std::cout << "请输入要出队的个数:";
std::cin >> n;
for (int i = 0; i < n; i++)
{
std::cout << "第"<<i+1<<"个出队:";
if (outQueue(QL)) {
std::cout << "出队成功!" << std::endl;
}
else {
std::cout << "出队失败!" << std::endl;
}
}
printfQueue(QL);
system("pause");
return 0;
}