//循环队列
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Elemtype;
typedef struct{
int* base;
int front;
int rear;
int size;
}queue;
//front前面预留一个空间 用来判满
Status creat(queue* Q,int mm){
Q->base=(Elemtype*)malloc(sizeof(Elemtype)*mm);
if(!Q->base){
printf("\t\t\t内存申请失败\n");
return ERROR;
}
Q->front=0;
Q->rear=0;
Q->size=mm;
return OK;
}
//队列长度
int length(queue Q){
return (Q.rear-Q.front+Q.size)%Q.size;//防止出现负数
}
//队列判满
bool full(queue Q){
return (Q.rear+1)%Q.size==Q.front;
}
//队列判空
bool empty(queue Q){
return Q.front==Q.rear;
}
//入队
Status enqueue(queue* Q,Elemtype e){
if(full(*Q)){
printf("\t\t\t队列已满,入队失败 !\n");
return ERROR;
}
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%Q->size;
// printf("元素入队成功!");
return OK;
}
//出队
Status dequeue(queue* Q){
if(empty(*Q)){
printf("\t\t\t当前队列为空!\n");
return ERROR;
}
Q->front=(Q->front+1)%Q->size;
return OK;
}
//返回队首元素
Elemtype getfront(queue Q){
if(empty(Q))
printf("\t\t\t当前队列为空!\n");
else return Q.base[Q.front];
}
//输出队列的元素
void show(queue Q){
if(empty(Q)){
printf("\t\t\t当前队列为空!\n");
return ;
}
int ff=Q.front;
while(ff!=Q.rear){
printf("%d ",Q.base[ff]);
ff=(ff+1)%Q.size;
}
printf("\n");
}
Status destroy(queue* Q){
Q->front=0;
Q->rear=0;
Q->size=0;
free(Q->base);
return OK;
}
void menu(){
printf("\t\t----------------循环队列的操作程序----------------\n");
printf("\t\toption:\n");
printf("\t\t\t1、创建一个循环队列\n");
printf("\t\t\t2、查询当前队列的长度\n");
printf("\t\t\t3、判断当前队列是否为空\n");
printf("\t\t\t4、判断当前队列是否已满\n");
printf("\t\t\t5、输出当前队列的元素\n");
printf("\t\t\t6、将指定元素入队\n");
printf("\t\t\t7、查询队首元素的值\n");
printf("\t\t\t8、将队首元素出队\n");
printf("\t\t\t9、销毁当前队列\n");
printf("\t\t\t0、退出当前程序\n");
printf("\t\t请输入你的选择: ");
}
int main()
{
queue Q;
while(1){
menu();
int op;
int n,m;
int e;
scanf("%d",&op);
switch(op){
case 0:{
system("cls");
printf("\t\t\t谢谢您的操作,再见!\n");
exit(0);
break;
}
case 1:{
printf("\t\t\t请输入你要搭建的队列的大小:");
scanf("%d",&n);
creat(&Q,n);
system("cls");
printf("\t\t\t创建成功!\n");
break;
}
case 2:{
system("cls");
printf("\t\t\t当前队列的长度为 %d \n",length(Q));
break;
}
case 3:{
system("cls");
if(empty(Q))
printf("\t\t\t当前队列为空!\n");
else printf("\t\t\t当前队列不为空!\n");
break;
}
case 4:{
system("cls");
if(full(Q))
printf("\t\t\t当前队列已满!\n");
else
printf("\t\t\t当前队列没满!\n");
break;
}
case 5:{
system("cls");
printf("\t\t\t当前队列的内容为:\n\t\t\t");
show(Q);
break;
}
case 6:{
system("cls");
printf("\t\t\t请输入你想要入队的元素:");
scanf("%d",&n);
enqueue(&Q,n);
break;
}
case 7:{
system("cls");
printf("\t\t\t当前队首的元素为:%d\n",getfront(Q));
break;
}
case 8:{
system("cls");
dequeue(&Q);
break;
}
case 9:{
system("cls");
destroy(&Q);
break;
}
default:
system("cls");
printf("\t\t你的输入有误,请重新输入!!!\n");
break;
}
printf("\n");
}
return 0;
}