以下代码根据《大话数据结构》提供的代码编写,用于模仿和练习:
#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 20
//循环队列的顺序存储结构
typedef struct
{
int data[MAXSIZE];
int front;
int rear;
}SqQueue;
//访问
int visit(int c)
{
cout<<c<<" ";
return 1;
}
//初始化一个空队列Q
int InitQueue(SqQueue *Q)
{
Q->front=0;
Q->rear=0;
return 1;
}
//将Q清为空队列
int ClearQueue(SqQueue *Q)
{
Q->front=Q->rear=0;
return 1;
}
//判断是否为空
int QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear) return 1;
else return 0;
}
//返回队列长度
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//队列不空则用e返回头元素
int GetHead(SqQueue Q,int &e)
{
if(Q.front==Q.rear) return 0;
e=Q.data[Q.front];
return 1;
}
//队列不满,则插入e为新元素
int EnQueue(SqQueue *Q,int e)
{
if((Q->rear+1)%MAXSIZE==Q->front) return 0;
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return 1;
}
//队列不空,则删除头元素,用e返回
int DeQueue(SqQueue *Q,int &e)
{
if(Q->front==Q->rear) return 0;
e=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return 1;
}
//输出队头->队尾
int QueueTraverse(SqQueue Q)
{
int i=Q.front;
while(i!=Q.rear)
{
visit(Q.data[i]);
i=(i+1)%MAXSIZE;
}
cout<<endl;
return 1;
}
//主函数
int main()
{
int e;
int d;
int i=0;
SqQueue Q;
InitQueue(&Q);
cout<<"空?"<<QueueEmpty(Q)<<endl;
cout<<"输入整行队列元素,数量不超过"<<MAXSIZE-1<<"输入-1提前结束"<<endl;
do
{
cin>>d;
if(d==-1) break;
i++;
EnQueue(&Q,d);
} while (i<MAXSIZE-1);
cout<<"队列长度:"<<QueueLength(Q)<<endl;
cout<<"空?"<<QueueEmpty(Q)<<endl;
GetHead(Q,e);
cout<<"头?"<<e<<endl;
cout<<"插入5:"<<endl;
EnQueue(&Q,5);
DeQueue(&Q,e);
cout<<"整体输出"<<endl;
QueueTraverse(Q);
cout<<"删除的是:"<<e<<endl;
ClearQueue(&Q);
cout<<"空?"<<QueueEmpty<<endl;
system("pause");
return 0;
}
在循环队列中
计算队列长度:(rear-front+MAXSIZE)%MAXSIZE
判断空:rear==front
判断满:(rear+1)%MAXSIZE==front
循环队列会出现套圈的现象,所以时刻记得对最大容量取余。