#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 4///分配的最大空间
typedef struct que
{
int *base;///存数据
int front;///队首
int rear;///队尾
}queueLink;
int initLoopQueue(queueLink *);///初始化循环队列
int push_LoopQueue(queueLink *,int );///入队
int pop_LoopQueue(queueLink *,int *);///出队
int top_LoopQueue(queueLink ,int *);///查找队首
int print_LoopQueue(queueLink );///输出循环队列
void clear();///清屏函数
int main()
{
queueLink Q;
int choose;///菜单选择
int n;///输入数据的变量
do
{
///页面设计
printf("\t\t\t*********************************\n");
printf("\t\t\t*1.循环队列的初始化\t\t*\n");
printf("\t\t\t*2.循环队列的入队\t\t*\n");
printf("\t\t\t*3.循环队列的出队\t\t*\n");
printf("\t\t\t*4.取循环队列的队首元素\t\t*\n");
printf("\t\t\t*5.循环队列的输出(从队首到队底) *\n");
printf("\t\t\t*0.退出\t\t\t\t*\n");
printf("\t\t\t*********************************\n");
printf("\t\t\t请输入你需要操作的数字:");
scanf("%d",&choose);
if(choose==0)
{
printf("\t\t\t欢迎下来再使用!\n");
break;
}
switch(choose)
{
case 1:
if(initLoopQueue(&Q))///判断是否申请成功
puts("初始化成功");
else
puts("初始化失败");
break;
case 2:
printf("请输入你要入队的元素:");
scanf("%d",&n);
if(!push_LoopQueue(&Q,n))///判断是否队列满了,提示用户
puts("循环队列已满");
break;
case 3:
if(pop_LoopQueue(&Q,&n))///判断是否还有数据可出队
printf("出队元素为:%d\n",n);
else
printf("删除失败,循环队列为空的\n");
break;
case 4:
if(top_LoopQueue(Q,&n))
printf("队首元素为:%d\n",n);
else
printf("循环队列为空的,无队首\n");
break;
case 5:
printf("循环队列的输出:");
print_LoopQueue(Q)==OK?printf("输出完毕!\n"):printf("NULL\n");///三目运算符,判断队列是否为空的
break;
default:
printf("输入错误,请重新输入\n");
break;
}
clear();///清屏
}while(1);
return 0;
}
///初始化循环队列
int initLoopQueue(queueLink *Q)
{
Q->base=(int *)malloc(MAXSIZE*sizeof(int ));///申请空间
if(!Q->base)
return ERROR;///申请失败返回ERROR
Q->front=Q->rear=0;///循环队列一开始都是指向初始位置0
return OK;///申请成功返回OK
}
///入队
int push_LoopQueue(queueLink *Q,int n)
{
if((Q->rear+1)%MAXSIZE==Q->front)///每次入队之后,rear都会先指向下一个,所以先判断rear+1是不是到了front的位置,是的话说明队列满了
return ERROR;///入队失败返回ERROR
Q->base[Q->rear]=n;///空间足够就入队,
Q->rear=(Q->rear+1)%MAXSIZE;///入队之后,rear要指向下一个,模它的最大空间,因为是循环队列
return OK;///入队成功返回OK
}
///出队
int pop_LoopQueue(queueLink *Q,int *n)
{
if(Q->front==Q->rear)///在出队之前先判断front和rear都指向同一个位置,如果是就跟初始化一样,也就是队列是空的
return ERROR;///出队失败返回ERROR
*n=Q->base[Q->front];///把出队的值赋值给n,n返回的时候进行输出
Q->front=(Q->front+1)%MAXSIZE;///出队之后要指向下一个,因为循环队列,要取模MAXSIZE
return OK;///出队成功返回OK
}
///查找队首元素
int top_LoopQueue(queueLink Q,int *n)
{
if(Q.rear==Q.front)///rear和front指向同一个位置说明空的,查询失败返回ERROR
return ERROR;
*n=Q.base[Q.front];///把队首元素赋值给n,n进行返回并输出
return OK;///查询成功返回OK
}
///输出循环队列
int print_LoopQueue(queueLink Q)
{
///Q在这里是局部变量,且在这Q不是指针类型,这里直接使用Q,不会改变Q的内容,只是输出
if(Q.rear==Q.front)///rear和front指向同一个位置说明是空的,返回ERROR
return ERROR;
while(Q.rear!=(Q.front)%MAXSIZE)///循环队列输出的操作
{
Q.front%=MAXSIZE;
printf("%d ",Q.base[Q.front++]);
}
puts("");
return OK;
}
///清屏
void clear()
{
printf("请按任意键继续......\n");
getch();
system("cls");
}
循环队列基本操作
最新推荐文章于 2024-06-24 14:17:36 发布