A-C/ex3_2_1.c
2022-04-14 21:51:45 -04:00

212 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Des: 此文件用于实现环形队列的基本操作和出列问题
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#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;i<n;i++){
printf("请输入第 %d 个元素:",i+1);
scanf("%d",&e);
EnQueue(&Q1,e);
}
OutputQueue(Q1);
break;
case 2:
n=DeQueue(&Q1,&e);
if(n>0){
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;
}