实现循环队列要有两个索引,一个头索引(front),一个尾索引(rear),牺牲一个空间,让rear等于此空间的下标,以便判断队列为空或满的问题。
- 当rear == front时,循环队列为空;
- 当(rear+1)%maxsize == front时,循环队列为满
实现如下:
#include <stdio.h>
#include <malloc.h>
typedef struct queue
{
int *base; //数组的首地址
int front; //头索引
int rear; //尾索引
int maxsize; //数组空间的最大值
}queue;
void init(queue *qu); //初始化队列
int push(queue *qu, int val); //入队
int pop(queue *qu, int *val); //出队
void show(queue *qu); //查看队列所有元素
void main()
{
queue qu;
int choose;
int val;
while(1)
{
printf("为循环队列提供一下选项: \n");
printf("1. 初始化循环队列\n");
printf("2. 入队\n");
printf("3. 出队\n");
printf("4. 查看所有元素\n");
printf("输入你的选项(输入0退出): ");
scanf("%d", &choose);
switch(choose)
{
case 1:
init(&qu);
printf("初始化成功!\n\n");
break;
case 2:
printf("输入你要入队的数: ");
scanf("%d", &val);
if(push(&qu, val) == 1)
{
printf("入队成功!\n\n");
}
break;
case 3:
if(pop(&qu, &val) == 1)
{
printf("出队成功, 出队元素为%d\n\n", val);
}
break;
case 4:
show(&qu);
printf("\n\n");
break;
default:
exit(-1);
}
}
}
//初始化
void init(queue *qu)
{
printf("输入要分配的空间大小: ");
scanf("%d", &qu->maxsize);
qu->base = (int*)malloc(sizeof(int) * qu->maxsize);
if(qu->base == NULL)
{
printf("内存空间分配失败!\n\n");
return;
}
qu->front = qu->rear = 0;
}
//入队
int push(queue *qu, int val)
{
if((qu->rear+1) % qu->maxsize == qu->front)
{
printf("循环队列满!\n\n");
return 0;
}
else
{
qu->base[qu->rear] = val;
qu->rear = (qu->rear+1) % qu->maxsize;
return 1;
}
}
//出队
int pop(queue *qu, int *val)
{
if(qu->front == qu->rear)
{
printf("循环队列空!\n\n");
return 0;
}
else
{
*val = qu->base[qu->front];
qu->front = (qu->front+1) % qu->maxsize;
return 1;
}
}
//查看所有
void show(queue *qu)
{
int temp = qu->front;
if(qu->front == qu->rear)
{
printf("循环队列为空!\n\n");
}
else
{
while(temp != qu->rear)
{
printf("%d ", qu->base[temp]);
temp = (temp+1) % qu->maxsize;
}
}
}