更新 'ex3_2_1.c'
This commit is contained in:
parent
0bbb63637d
commit
e9084b7b32
74
ex3_2_1.c
74
ex3_2_1.c
@ -1,3 +1,6 @@
|
|||||||
|
/*
|
||||||
|
Des: 此文件用于实现环形队列的基本操作和出列问题
|
||||||
|
*/
|
||||||
#include<stdio.h>
|
#include<stdio.h>
|
||||||
#include<stdlib.h>
|
#include<stdlib.h>
|
||||||
#include<conio.h>
|
#include<conio.h>
|
||||||
@ -7,11 +10,16 @@ typedef struct {
|
|||||||
DataType data[MAX]; // 元素
|
DataType data[MAX]; // 元素
|
||||||
int front,rear; // 队头队尾指针
|
int front,rear; // 队头队尾指针
|
||||||
}SqQueue;
|
}SqQueue;
|
||||||
|
/* 初始化队列 */
|
||||||
void InitQueue(SqQueue *sq){
|
void InitQueue(SqQueue *sq){
|
||||||
sq->rear = sq->front = 0;
|
sq->rear = sq->front = 0;
|
||||||
printf("\n初始化成功\n");
|
printf("\n初始化成功\n");
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
将数据 e 入队
|
||||||
|
|
||||||
|
返回值为 1 ,如果返回 0 则队满
|
||||||
|
*/
|
||||||
int EnQueue(SqQueue *sq, DataType e){
|
int EnQueue(SqQueue *sq, DataType e){
|
||||||
if((sq->rear+1) % MAX == sq->front){
|
if((sq->rear+1) % MAX == sq->front){
|
||||||
return 0;
|
return 0;
|
||||||
@ -20,14 +28,24 @@ int EnQueue(SqQueue *sq, DataType e){
|
|||||||
sq->data[sq->rear] = e;
|
sq->data[sq->rear] = e;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
将数据出队到 e
|
||||||
|
|
||||||
|
返回值为 1 ,如果返回 0 则队空
|
||||||
|
*/
|
||||||
int DeQueue(SqQueue *sq, DataType *e){
|
int DeQueue(SqQueue *sq, DataType *e){
|
||||||
if(sq->rear == sq->front){
|
if(sq->rear == sq->front){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
sq->front = (sq->front+1) % MAX; // 队头循环进 1
|
sq->front = (sq->front+1) % MAX;
|
||||||
*e = sq->data[sq->front];
|
*e = sq->data[sq->front];
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
读取队头元素值给 e
|
||||||
|
|
||||||
|
返回值为 1 ,如果返回 0 则队空
|
||||||
|
*/
|
||||||
int GetHead(SqQueue *sq, DataType *e){
|
int GetHead(SqQueue *sq, DataType *e){
|
||||||
if(sq->rear == sq->front){
|
if(sq->rear == sq->front){
|
||||||
return 0;
|
return 0;
|
||||||
@ -35,18 +53,31 @@ int GetHead(SqQueue *sq, DataType *e){
|
|||||||
*e = sq->data[(sq->front + 1) % MAX];
|
*e = sq->data[(sq->front + 1) % MAX];
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
判断队是否为空
|
||||||
|
|
||||||
|
返回值为 0 则队不空,返回值为 1 则队空
|
||||||
|
*/
|
||||||
int QueueEmpty(SqQueue sq){
|
int QueueEmpty(SqQueue sq){
|
||||||
if(sq.rear == sq.front){
|
if(sq.rear == sq.front){
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
判断队是否满
|
||||||
|
|
||||||
|
返回值为 0 则队不满,返回值为 1 则队满
|
||||||
|
*/
|
||||||
int QueueFull(SqQueue sq){
|
int QueueFull(SqQueue sq){
|
||||||
if((sq.rear+1) % MAX == sq.front){
|
if((sq.rear+1) % MAX == sq.front){
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
输出队列中的所有元素
|
||||||
|
*/
|
||||||
void OutputQueue(SqQueue sq){
|
void OutputQueue(SqQueue sq){
|
||||||
DataType e;
|
DataType e;
|
||||||
if(sq.rear == sq.front){
|
if(sq.rear == sq.front){
|
||||||
@ -58,6 +89,11 @@ void OutputQueue(SqQueue sq){
|
|||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
从队列中删除一个元素
|
||||||
|
|
||||||
|
返回值为 1,如果返回值为 0 则队空
|
||||||
|
*/
|
||||||
int DeleteOne(SqQueue *sq){
|
int DeleteOne(SqQueue *sq){
|
||||||
DataType e;
|
DataType e;
|
||||||
if(sq->rear == sq->front){
|
if(sq->rear == sq->front){
|
||||||
@ -66,32 +102,40 @@ int DeleteOne(SqQueue *sq){
|
|||||||
DeQueue(sq,&e);
|
DeQueue(sq,&e);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
void baoshu(SqQueue *sq, int n, int e){
|
/*
|
||||||
|
解决出列问题
|
||||||
|
|
||||||
|
先将所有数入队sq,循环出队sq,如果数到指定值则保存到新的队列Q2,
|
||||||
|
否则重新入队sq数数,最后产生的新的队列Q2则为出列顺序
|
||||||
|
|
||||||
|
n 为人数,e 为指定值
|
||||||
|
*/
|
||||||
|
void chulie(SqQueue *sq, int n, int e){
|
||||||
SqQueue Q2;
|
SqQueue Q2;
|
||||||
InitQueue(&Q2);
|
InitQueue(&Q2);
|
||||||
DataType temp;
|
DataType temp;
|
||||||
int i=0;
|
int i=0;
|
||||||
for(int i=1;i<=n;i++){
|
for(int i=1;i<=n;i++){
|
||||||
EnQueue(sq, i); // 全部入队
|
EnQueue(sq, i);
|
||||||
}
|
}
|
||||||
while(!QueueEmpty(*sq)){
|
while(!QueueEmpty(*sq)){
|
||||||
i++;
|
i++;
|
||||||
DeQueue(sq,&temp);
|
DeQueue(sq,&temp);
|
||||||
if(i==e){
|
if(i==e){
|
||||||
EnQueue(&Q2,temp); // 出队顺序
|
EnQueue(&Q2,temp);
|
||||||
i=0;
|
i=0;
|
||||||
} else {
|
} else {
|
||||||
EnQueue(sq,temp); // 重新入队
|
EnQueue(sq,temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("出队顺序如下:\n");
|
printf("出列顺序如下:\n");
|
||||||
OutputQueue(Q2);
|
OutputQueue(Q2);
|
||||||
}
|
}
|
||||||
int main(){
|
int main(){
|
||||||
SqQueue Q1;
|
SqQueue Q1;
|
||||||
int n,choice;
|
int n,choice;
|
||||||
DataType e;
|
DataType e;
|
||||||
InitQueue(&Q1); // 初始化
|
InitQueue(&Q1);
|
||||||
|
|
||||||
for(;;){
|
for(;;){
|
||||||
printf("\t\t1.入队\n");
|
printf("\t\t1.入队\n");
|
||||||
@ -99,7 +143,7 @@ int main(){
|
|||||||
printf("\t\t3.输出所有元素\n");
|
printf("\t\t3.输出所有元素\n");
|
||||||
printf("\t\t4.读取队列的第一个元素\n");
|
printf("\t\t4.读取队列的第一个元素\n");
|
||||||
printf("\t\t5.删除一个元素\n");
|
printf("\t\t5.删除一个元素\n");
|
||||||
printf("\t\t6.应用题:重复数数\n");
|
printf("\t\t6.应用题:出列问题\n");
|
||||||
printf("\t\t0.退出\n");
|
printf("\t\t0.退出\n");
|
||||||
|
|
||||||
printf("请选择:");
|
printf("请选择:");
|
||||||
@ -145,16 +189,16 @@ int main(){
|
|||||||
OutputQueue(Q1);
|
OutputQueue(Q1);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
InitQueue(&Q1); // 重新初始化
|
InitQueue(&Q1);
|
||||||
printf("请输入人数:");
|
printf("请输入人数:");
|
||||||
scanf("%d",&n);
|
scanf("%d",&n);
|
||||||
if(n>MAX-1){
|
while(n>MAX-1){
|
||||||
printf("人数过多,请重试");
|
printf("人数过多,请重新输入\n请输入人数:");
|
||||||
break;
|
scanf("%d",&n);
|
||||||
}
|
}
|
||||||
printf("请输入指定的报数 m:");
|
printf("请输入指定的出列数: m:");
|
||||||
scanf("%d",&e);
|
scanf("%d",&e);
|
||||||
baoshu(&Q1,n,e);
|
chulie(&Q1,n,e);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user