/* Des: 此文件用于实现环形队列的基本操作和出列问题 */ #include #include #include #define MAX 1000 typedef int DataType; typedef struct { DataType data[MAX]; // 元素 int front,rear; // 队头队尾指针 }SqQueue; /* 初始化队列 */ void InitQueue(SqQueue *sq){ sq->rear = sq->front = 0; printf("\n初始化成功\n"); } /* 将数据 e 入队 返回值为 1 ,如果返回 0 则队满 */ int EnQueue(SqQueue *sq, DataType e){ if((sq->rear+1) % MAX == sq->front){ return 0; } sq->rear = (sq->rear + 1) % MAX; sq->data[sq->rear] = e; return 1; } /* 将数据出队到 e 返回值为 1 ,如果返回 0 则队空 */ int DeQueue(SqQueue *sq, DataType *e){ if(sq->rear == sq->front){ return 0; } sq->front = (sq->front+1) % MAX; *e = sq->data[sq->front]; return 1; } /* 读取队头元素值给 e 返回值为 1 ,如果返回 0 则队空 */ int GetHead(SqQueue *sq, DataType *e){ if(sq->rear == sq->front){ return 0; } *e = sq->data[(sq->front + 1) % MAX]; return 1; } /* 判断队是否为空 返回值为 0 则队不空,返回值为 1 则队空 */ int QueueEmpty(SqQueue sq){ if(sq.rear == sq.front){ return 1; } return 0; } /* 判断队是否满 返回值为 0 则队不满,返回值为 1 则队满 */ int QueueFull(SqQueue sq){ if((sq.rear+1) % MAX == sq.front){ return 1; } return 0; } /* 输出队列中的所有元素 */ void OutputQueue(SqQueue sq){ DataType e; if(sq.rear == sq.front){ return; } while(sq.rear != sq.front){ DeQueue(&sq,&e); printf("%d ", e); } printf("\n"); } /* 从队列中删除一个元素 返回值为 1,如果返回值为 0 则队空 */ int DeleteOne(SqQueue *sq){ DataType e; if(sq->rear == sq->front){ return 0; } DeQueue(sq,&e); return 1; } /* 解决出列问题 先将所有数入队sq,循环出队sq,如果数到指定值则保存到新的队列Q2, 否则重新入队sq数数,最后产生的新的队列Q2则为出列顺序 n 为人数,e 为指定值 */ void chulie(SqQueue *sq, int n, int e){ SqQueue Q2; InitQueue(&Q2); DataType temp; int i=0; for(int i=1;i<=n;i++){ EnQueue(sq, i); } while(!QueueEmpty(*sq)){ i++; DeQueue(sq,&temp); if(i==e){ EnQueue(&Q2,temp); i=0; } else { EnQueue(sq,temp); } } printf("出列顺序如下:\n"); OutputQueue(Q2); } int main(){ SqQueue Q1; int n,choice; DataType e; InitQueue(&Q1); for(;;){ printf("\t\t1.入队\n"); printf("\t\t2.出队\n"); printf("\t\t3.输出所有元素\n"); printf("\t\t4.读取队列的第一个元素\n"); printf("\t\t5.删除一个元素\n"); printf("\t\t6.应用题:出列问题\n"); printf("\t\t0.退出\n"); printf("请选择:"); scanf("%d",&choice); if(choice==0) break; switch (choice) { case 1: printf("请输入需要输入的元素个数:"); scanf("%d",&n); for(int i=0;i0){ printf("出队元素为 %d\n",e); } else { printf("队为空\n"); } break; case 3: OutputQueue(Q1); break; case 4: n=GetHead(&Q1,&e); if(n>0){ printf("队列的第一个元素为 %d\n",e); } else { printf("队为空\n"); } break; case 5: n=DeleteOne(&Q1); if(n==0){ printf("删除失败,队为空。\n"); } else { printf("删除成功\n"); } OutputQueue(Q1); break; case 6: InitQueue(&Q1); printf("请输入人数:"); scanf("%d",&n); while(n>MAX-1){ printf("人数过多,请重新输入\n请输入人数:"); scanf("%d",&n); } printf("请输入指定的出列数: m:"); scanf("%d",&e); chulie(&Q1,n,e); default: break; } printf("请按任意键继续..."); getch(); system("cls"); } printf("感谢使用,再见\n"); return 0; }