//循環隊列
#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;
}