下面是循环队列的定义和基本操作:
//定义函数状态码
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//初始长度,扩容时增加的长度
#define INIT_SIZE 20
#define INCREASESIZE 10
typedef int Status;//函数返回状态
typedef int QElemType;//整型为例
//循环队列存储结构定义
typedef struct {
QElemType *base;//存储空间基址
int front;//队头
int rear;//队尾
int queue_size;//容量
}SqQueue;
//队列是否为空
bool Queue_Empty(SqQueue &Q)
{
if(Q.front==Q.rear)return true;
else return false;
}
//队列是否(假)满
bool Queue_Full(SqQueue &Q)
{
if((Q.rear+1)%Q.queue_size==Q.front)return true;
else return false;
}
//队列初始化
Status Queue_Init(SqQueue &Q)
{
Q.base=(QElemType *)malloc(INIT_SIZE*sizeof(QElemType));
if(!Q.base) return OVERFLOW;//开辟失败
Q.front=0;
Q.rear=0;
Q.queue_size=INIT_SIZE;
return OK;
}
//队尾元素插入
Status Queue_Insert(SqQueue &Q,QElemType e)
{
//队列满,扩容
if(Queue_Full(Q))
{
Q.base=(QElemType *)realloc(Q.base,(INIT_SIZE+INCREASESIZE)*sizeof(QElemType));
if(!Q.base) return OVERFLOW;
Q.queue_size=Q.queue_size+INCREASESIZE;
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%Q.queue_size;
return OK;
}
//队头元素的获取
Status Queue_Get(SqQueue &Q,QElemType &e)
{
if(Queue_Empty(Q))return ERROR; //空队列的处理
e=Q.base[Q.front];
Q.front=(Q.front+1)%Q.queue_size;
return OK;
}
//队列的长度
int Queue_Length(SqQueue &Q)
{
return (Q.rear-Q.front+Q.queue_size)%Q.queue_size;
}
下面是一个测试函数:
int main()
{
int n;
int num;
SqQueue Odd;
if(Queue_Init(Odd)!=OK)
{
printf("defult\n");
return 0;
}
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&num);
Queue_Insert(Odd,num);
}
printf("Empty:%d\n",Queue_Empty(Odd));
printf("length:%d\n",Queue_Length(Odd));
for(int i=0;i<n;i++)
{
int e;
Queue_Get(Odd,e);
printf("%d ",e);
}
}