From e9084b7b32a28efeae91f08141e4ef4315ee6d69 Mon Sep 17 00:00:00 2001 From: xtaodada Date: Thu, 14 Apr 2022 21:51:45 -0400 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20'ex3=5F2=5F1.c'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ex3_2_1.c | 378 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 211 insertions(+), 167 deletions(-) diff --git a/ex3_2_1.c b/ex3_2_1.c index 547e732..28696ce 100644 --- a/ex3_2_1.c +++ b/ex3_2_1.c @@ -1,167 +1,211 @@ -#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"); -} -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; -} -int DeQueue(SqQueue *sq, DataType *e){ - if(sq->rear == sq->front){ - return 0; - } - sq->front = (sq->front+1) % MAX; // 队头循环进 1 - *e = sq->data[sq->front]; - return 1; -} -int GetHead(SqQueue *sq, DataType *e){ - if(sq->rear == sq->front){ - return 0; - } - *e = sq->data[(sq->front + 1) % MAX]; - return 1; -} -int QueueEmpty(SqQueue sq){ - if(sq.rear == sq.front){ - return 1; - } - return 0; -} -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"); -} -int DeleteOne(SqQueue *sq){ - DataType e; - if(sq->rear == sq->front){ - return 0; - } - DeQueue(sq,&e); - return 1; -} -void baoshu(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); - if(n>MAX-1){ - printf("人数过多,请重试"); - break; - } - printf("请输入指定的报数 m:"); - scanf("%d",&e); - baoshu(&Q1,n,e); - default: - break; - } - printf("请按任意键继续..."); - getch(); - system("cls"); - } - printf("感谢使用,再见\n"); - return 0; -} +/* + 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; +}