1.在循环队列中需要设置队头,队尾两个指针,并且约定;队头指针front指向队头元素的前一个位置,队尾指针rear指向队尾元素。队列的这种头尾相接的顺序存储结构称为循环队列。
2.在循环队列中有个很重要的问题就是:队空和队满的判定问题。在循环队列中队空和队满的判定条件都可以是front=rear。因此,我们需要浪费一个数组元素空间,让队满的条件变为:(rear+1)%QueueSize=front
#include<stdio.h>
#include<stdlib.h>
#define N 100
typedef struct queue
{
int data[N];
int front,rear;
} Queue;
/*
函数功能:队列初始化
函数接口:
*/
void init_queue(Queue *q)
{
q->front=q->rear=0;
}
/*
函数功能:入队
*/
void push_queue(Queue *q,int data)
{
//判断队列是否溢出
if((q->rear+1)%N==q->front) //队满的条件
{
printf("上溢\n");
exit(-1);
}
q->data[q->rear]=data;
q->rear=(q->rear+1)%N; //循环意义下的加1
}
/*
函数功能:出队
*/
int get_queue(Queue *q)
{
//队列判空操作
if(q->front==q->rear)
{
printf("下溢\n");
exit(-1);
}
int data;
data=q->data[q->front];
q->front=(q->front+1)%N;
return data;
}
/*
函数功能:读取队头原数
*/
int get_front(Queue *q)
{
//队列判空操作
if(q->rear==q->front)
{
printf("下溢\n");
exit(-1);
}
int data;
data=q->data[q->front];
return data;
}
int main(void)
{
Queue *q=NULL;
int push_data,get_data;
char ch;
int ret1,ret2;
q=(Queue*)malloc(sizeof(Queue));
if(q==NULL)
{
printf("内存申请失败\n");
exit(-1);
}
//初始化
init_queue(q);
//入队
while(1)
{
printf("请输入一个数值:");
ret1=scanf("%d",&push_data);
if(ret1!=1)
{
fflush(stdin);
continue;
}
push_queue(q,push_data);
printf("是否执行入队操作:");
ret2=scanf(" %c",&ch);
if(ch=='n'||ch=='N'&&ret2!=1)
{
break;
}
}
//printf("%d--->%d",q->front,q->rear);
//出队
while(1)
{
printf("是否执行出队操作:");
ret1=scanf(" %c",&ch);
if(ret1!=1)
{
fflush(stdin);
continue;
}
if(ch=='n'||ch=='N'){
break;
}
printf("出队操作%d\n",get_queue(q));
}
//获取对头原数
printf("队头元素为:%d",get_front(q));
return 0;
}