循环队列的几个注意点:
1、队空条件判断
rear == front
2、队满条件判断
为了防止与队空条件判断起冲突,舍弃一个存储空间
(rear+1)%size == front 注:size为数组大小
下面附上全代码
//循化队列
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
#define YES 100
#define NO 101
//定义队列结构
typedef struct cque
{
int data[SIZE];
int front;
int rear;
}Cque;
//创建队列,分配空间
int create_que(Cque **queue)
{
*queue = (Cque*)malloc(sizeof(Cque));
//判断空间分配是否成功
if( NULL == *queue)
{
return NO;
}
return YES;
}
//初始化队列
int init_que(Cque *queue)
{
if( NULL == queue)
{
return NO;
}
queue->front = queue->rear = 0;
return YES;
}
//判断队满
int is_full(Cque *queue)
{
//为了防止和队空的判断条件重叠,留出一个空间不使用
if( (queue->rear+1)%SIZE == queue->front)
{
return YES;
}
return NO;
}
//判断队空
int is_empty(Cque *queue)
{
if(NULL == queue || queue->front == queue->rear)
{
return YES;
}
return NO;
}
//入队,需要先判断队列是否已满
int push_que(Cque *queue,int num)
{
if( YES == is_full(queue))
{
return NO;
}
queue->data[queue->rear] = num;
queue->rear = (queue->rear + 1) % SIZE;
return YES;
}
//出队
int pop_que(Cque *queue,int *num)
{
//先判断是否队空
if( YES == is_empty(queue))
{
return NO;
}
*num = queue->data[queue->front];
queue->front = (queue->front + 1) % SIZE;
return YES;
}
//获取队首元素
int get_front(Cque *queue,int *num)
{
//先判断是否队空
if( YES == is_empty(queue))
{
return NO;
}
*num = queue->data[queue->front];
return YES;
}
int main()
{
int i;
int num;
//创建指向队列的指针
Cque *queue = NULL;
//创建队列,分配空间
if( NO == create_que(&queue))
{
printf("创建队列失败!\n");
return NO;
}
//初始化队列
if( NO == init_que(queue))
{
printf("初始化失败!\n");
return NO;
}
//判断是否队空
if( is_empty(queue) == YES)
{
printf("队列为空!\n");
}
//入队
for(i = 0; i < 15 ; i++)
{
if( NO == push_que(queue,i+1))
{
printf("入队失败!\n");
}
}
//判断是否队满
if( is_full(queue) == YES)
{
printf("队列已满!\n");
}
//出队
for(i = 0; i < 5 ; i++)
{
if( NO == pop_que(queue,&num))
{
printf("出队失败!\n");
}
else
{
printf("data is %d\n",num);
}
}
//获得队首元素
if( NO == get_front(queue,&num))
{
printf("获取队首元素失败!\n");
}
else
{
printf("front data is %d\n",num);
}
return 0;
}